【问题标题】:Shift-reduce conflict between grammar rule and terminal in XtextXtext中语法规则和终端之间的Shift-reduce冲突
【发布时间】:2012-08-27 21:57:49
【问题描述】:

这是一个示例语法:

语法 org.xtext.example.mydsl.MyDsl 与 org.eclipse.xtext.common.Terminals

生成 myDsl“http://www.xtext.org/example/mydsl/MyDsl”

开始:elem += 狗;

狗: '狗'INT';' ;

终端 CAT : ('A'..'Z')('A'..'Z')('A'..'Z')' '('0'..'9')+;

当 Xtext 看到 DOG 1234 行时,它无法解析并会给出类似的错误“mismatch input DOG 1234... Expecting DOG”。我认为当Xtext遇到关键字时,它应该比终端具有更高的优先级。但它似乎很困惑。我该如何解决这个问题?

注意 DOG 和 CAT 用在不同的地方(即终端 CAT 用于其他规则,但其定义与 DOG 规则冲突)

【问题讨论】:

  • 你能稍微澄清一下你的语法吗?我个人对术语的使用有点困惑。 FOO 是您的生产规则,再次有“FOO”,然后有一个称为 BAR 的终端定义。 'FOO' 应该是 BAR 类型吗?
  • 好吧,我修好了。希望它更容易。尽管如此,这在我的实际语法中是相同的语法规则,只是术语不同。规则 DOG 将识别输入字符串,如 DOG 134DOG 1234,但终端 CAT 也会识别相同的内容。

标签: xtext


【解决方案1】:

在这种情况下,如您所见,错误不是“Expection CAT_RULE ..”。因此,当您将 DOG1234 编写为元素时,Xtext 不会将其解析为 DOG 和 INT ,而是将 'DOG1234' 作为字符串,然后查找 DOG 规则,当然 DOG 规则只允许“DOG”关键字。

例如,如果您在 CAT 规则之后将 DOG 定义为另一个终端规则,并且元素 RAT 与 CAT 规则“冲突”并使用新行将其 INT 值与关键字分开,您将看到它们都有效。

    START: elem += DOG 
    catelem += CAT 
    ratelem += RAT;

    RAT:
        "RAT"INT";"
    ;



terminal CAT : ('A'..'Z')('A'..'Z')('A'..'Z')' '('0'..'9')+;
terminal DOG : "DOG"("0".."9")+";";

然后使用您的新 DSL 示例:

DOG1234;
CSA 1 
RAT
12347
;

【讨论】:

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