由终端无效的Xtext规则

时间:2012-03-19 15:43:46

标签: 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*;
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不匹配?更重要的是,为什么即使添加新终端而不实际使用它也会导致此错误消息?

1 个答案:

答案 0 :(得分:3)

解析分两步完成:lexing和parsing。终端规则在lexing阶段=>完成在您希望ID的位置,可以识别WildcardName =>您还必须为此使用数据类型规则

WildcardName       : (ID | '*')+;