在标识符中使用时禁用关键字突出显示
Disable highlighting of keywords when used in identifiers
我目前可以很好地解析我的 Xtext 语言,但是 运行 遇到了问题:
我的导入语句如下所示:
ImportStatement:
'use' QualifiedName '.*'? END ;
terminal END:
';' ;
给我这样好的结果:
use test.io.Classname;
use test.io.*;
但是当我想做类似的事情时:
use example.use.TestClass;
限定名中的'use'像第一个'use'一样被高亮显示为关键字。我是 Xtext 的新手,所以不知道 idea 如何删除它。我曾尝试更改语法的顺序和结构,但无济于事。全部内容如下:
/*
* 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 or their GitHub page 的教程,其中说明了如何解决此问题,但缺少一些信息,例如更改 ide[=31= 上的访问限制] 库,总的来说,它不起作用。我已经做了一切,没有任何反应,我继续得到这个语法高亮。
我的问题是,当有问题的关键字是 identifier 的一部分或被用作一个时,我如何停止 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
}
}
而且效果很好
我目前可以很好地解析我的 Xtext 语言,但是 运行 遇到了问题:
我的导入语句如下所示:
ImportStatement:
'use' QualifiedName '.*'? END ;
terminal END:
';' ;
给我这样好的结果:
use test.io.Classname;
use test.io.*;
但是当我想做类似的事情时:
use example.use.TestClass;
限定名中的'use'像第一个'use'一样被高亮显示为关键字。我是 Xtext 的新手,所以不知道 idea 如何删除它。我曾尝试更改语法的顺序和结构,但无济于事。全部内容如下:
/*
* 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 or their GitHub page 的教程,其中说明了如何解决此问题,但缺少一些信息,例如更改 ide[=31= 上的访问限制] 库,总的来说,它不起作用。我已经做了一切,没有任何反应,我继续得到这个语法高亮。
我的问题是,当有问题的关键字是 identifier 的一部分或被用作一个时,我如何停止 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
}
}
而且效果很好