2012-03-19 36 views
0

作为更大语法的一部分,我试图定义规则来描述“方法调用”。我遇到了麻烦,我想我把问题减少到了我对终端的知识缺乏。包含终端不工作的Xtext规则

这里是描述我的问题,一个简单的语法:

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 

为什么'foo'和'variable'不是通过终端ID匹配?更重要的是,为什么即使添加新的终端而没有真正使用它也会导致这个错误信息?

回答

2

解析分两步完成:lexing和解析。终端规则在lexing阶段完成=>在您期望ID识别WildcardName的地方 =>您必须为此使用数据类型规则

WildcardName  : (ID | '*')+;