在标识符中使用时禁用对关键字的突出显示

时间:2017-03-05 02:43:27

标签: eclipse eclipse-plugin xtext

我现在解析我的Xtext语言很好,但遇到了问题:

我的导入语句,如下所示:

ImportStatement:
    'use' QualifiedName '.*'? END ;

terminal END:
    ';' ; 

给我这样的好结果:

use test.io.Classname;
use test.io.*;

然而,当我想做类似的事情时:

use example.use.TestClass;

使用'在限定名称中突出显示,就好像它是一个关键字,就像第一个使用'一样。我是Xtext的新手,所以不知道如何删除它。我试过改变语法的顺序和结构,但无济于事。整个事情如下:

/*
 * Parser rules.
 */

Model:
    (imports+=ImportStatement)*;

ImportStatement:
    KEYWORD name=QualifiedName ('.*')? END;

/*
 * Parser types.
 */

QualifiedName:
    Word ('.' Word)?;

Word:
    IDENTIFIER | KEYWORD;

/*
 * Lexer types.
 */

terminal IDENTIFIER: '^'?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

KEYWORD: 'use';

terminal END: ';';

我查看了a blog或其GitHub page上的教程,其中说明了如何修复此问题,但缺少一些信息,例如更改 ide 库的访问限制总的来说,它不起作用。我做了一切,没有任何反应,我继续强调这种语法。

我的问题是,如果有问题的关键字是标识符的一部分,或者被用作一个标识符,我怎么能在Xtext中停止语法高亮?

1 个答案:

答案 0 :(得分:2)

从您的问题

不清楚什么是无效的。是解析不起作用还是突出显示。如果它是高亮的,你的实现实际上是什么样的?

在你的dsl的生成日志中,你得到的第一件事就是这个

error(208): ../org.xtext.example.mydsl3/src-gen/org/xtext/example/mydsl3/parser/antlr/internal/InternalMyDsl.g:263:1: The following token definitions can never be matched because prior tokens match the same input: RULE_ID
error(208): ../org.xtext.example.mydsl3.ide/src-gen/org/xtext/example/mydsl3/ide/contentassist/antlr/internal/InternalMyDsl.g:448:1: The following token definitions can never be matched because prior tokens match the same input: RULE_ID

我认为这些错误只是为了好玩而你并不在乎。 在你的情况下它应该不是一个问题,但在任何情况下摆脱它应该是好的。

Model:
    (imports+=ImportStatement)*;

ImportStatement:
    KEYWORD name=QualifiedName ('.*')? ';';

/*
 * Parser types.
 */

QualifiedName:
    Word ('.' Word)?;

Word:
    ID | KEYWORD;

/*
 * Lexer types.
 */

@Override
terminal ID: '^'?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*;

KEYWORD: 'use';

下一步是实现突出显示

import com.google.inject.Inject
import org.eclipse.emf.ecore.EObject
import org.eclipse.xtext.ide.editor.syntaxcoloring.DefaultSemanticHighlightingCalculator
import org.eclipse.xtext.ide.editor.syntaxcoloring.HighlightingStyles
import org.eclipse.xtext.ide.editor.syntaxcoloring.IHighlightedPositionAcceptor
import org.eclipse.xtext.util.CancelIndicator
import org.xtext.example.mydsl3.myDsl.ImportStatement
import org.xtext.example.mydsl3.myDsl.MyDslPackage
import org.xtext.example.mydsl3.services.MyDslGrammarAccess

class MyDslSemanticHighlightingCalculator extends DefaultSemanticHighlightingCalculator {

     @Inject package MyDslGrammarAccess grammar

    override protected boolean highlightElement(EObject object, IHighlightedPositionAcceptor acceptor,
        CancelIndicator cancelIndicator) {
        if (object instanceof ImportStatement) {
            highlightFeature(acceptor, object, MyDslPackage.eINSTANCE.importStatement_Name, HighlightingStyles.DEFAULT_ID)
        }
        super.highlightElement(object, acceptor, cancelIndicator)
    }

}

和绑定

@FinalFieldsConstructor
class MyDslUiModule extends AbstractMyDslUiModule {

    def Class<? extends ISemanticHighlightingCalculator> bindISemanticHighlightingCalculator() {
        MyDslSemanticHighlightingCalculator
    }
}

它完美无缺

Screenshot of resulting editor