【问题标题】:Xtext rule consisting of Terminals not working由终端组成的 Xtext 规则不起作用
【发布时间】:2012-03-20 03:16:46
【问题描述】:

作为更大语法的一部分,我试图定义规则来描述“方法调用”。我遇到了麻烦,我认为我将问题归结为我缺乏关于终端的知识。

这是描述我的问题的简单语法:

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'?更重要的是,为什么在没有实际使用的情况下添加新终端会导致此错误消息?

【问题讨论】:

    标签: grammar xtext terminal


    【解决方案1】:

    解析分两步完成:词法分析和解析。终端规则在词法分析阶段完成 => 在您期望识别通配符名称的 ID 的地方 => 你也必须为此使用数据类型规则

    WildcardName       : (ID | '*')+;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多