Grammar 由不工作的终端组成的Xtext规则

Grammar 由不工作的终端组成的Xtext规则,grammar,xtext,terminal,Grammar,Xtext,Terminal,作为更大语法的一部分,我试图定义描述“方法调用”的规则。我遇到了麻烦,我想我把问题归结为对终端缺乏了解 下面是一个简单的语法来描述我的问题: grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" Model: methodCalls+=MethodCall*; MethodCal

作为更大语法的一部分,我试图定义描述“方法调用”的规则。我遇到了麻烦,我想我把问题归结为对终端缺乏了解

下面是一个简单的语法来描述我的问题:

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Model: methodCalls+=MethodCall*;
MethodCall: 'call' ID '.' ID;
用这种语法,我可以写一些

call variable.method
call foo.bar
现在我想在方法名中允许使用通配符。我将MethodCall规则更改为

MethodCall: 'call' ID '.' WildcardName;
在语法的最后我加了一句

terminal WildcardName       : ('a'..'z'|'A'..'Z'|'_'|'*'|'?') ('a'..'z'|'A'..'Z'|'_'|'0'..'9'|'*'|'?')*;
尝试

call variable.method
call foo.bar
我再次收到错误消息:

mismatched input 'foo' expecting RULE_ID
mismatched input 'variable' expecting RULE_ID

为什么终端ID不匹配“foo”和“variable”?更重要的是,为什么即使在没有实际使用的情况下添加新终端也会导致此错误消息?

解析分为两个步骤:词法分析和解析。终端规则在词法分析阶段=>在您希望识别ID的位置完成,通配符名称被识别 =>您还必须为此使用数据类型规则

WildcardName       : (ID | '*')+;

解析分为两个步骤:词法分析和解析。终端规则在词法分析阶段=>在您希望识别ID的位置完成,通配符名称被识别 =>您还必须为此使用数据类型规则

WildcardName       : (ID | '*')+;