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

Eclipse 在标识符中使用时禁用突出显示关键字,eclipse,eclipse-plugin,xtext,Eclipse,Eclipse Plugin,Xtext,我目前正在解析我的Xtext语言,但遇到了一个问题: 我的导入语句,如下所示: ImportStatement: 'use' QualifiedName '.*'? END ; terminal END: ';' ; use test.io.Classname; use test.io.*; 给我这样的好结果: ImportStatement: 'use' QualifiedName '.*'? END ; terminal END: ';' ; u

我目前正在解析我的Xtext语言,但遇到了一个问题:

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

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

terminal END:
    ';' ; 
use test.io.Classname;
use test.io.*;
给我这样的好结果:

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

terminal END:
    ';' ; 
use test.io.Classname;
use test.io.*;
但是,当我想做以下事情时:

use example.use.TestClass;
限定名称中的“use”会突出显示,就像第一个“use”一样,它是一个关键字。我是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: ';';
我已经看了一篇关于或其说明如何修复此问题的教程,其中缺少一些信息,例如更改我的ide库的访问限制,总体而言,它不起作用。我已经做了所有的事情,但什么都没有发生,我继续得到这个语法高亮显示


我的问题是,当所讨论的关键字是标识符的一部分或用作标识符时,如何停止在Xtext中突出显示语法?

您的问题中不太清楚什么不起作用。是解析不起作用,还是突出显示。如果是高性能的,那么您的实现实际上是什么样子的

在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
    }
}
@FinalFieldsConstructor
类MyDslUiModule扩展了AbstractMyDslUiModule{

def ClassAh!另一个完美的答案;谢谢!对于问题的模糊性,我很抱歉,我现在就解决它。至于错误,是的,我看到了它们,因为它们没有影响程序,我忽略了它们,还补充了一个事实,即我还没有完全理解错误。:P