Shift-减少Xtext中语法规则和终端之间的冲突

时间:2012-08-16 15:11:58

标签: xtext

这是一个示例语法:

  

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

     

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

     

START:elem + = DOG;

     

DOG:       '狗'INT';' ;

     

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

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

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

1 个答案:

答案 0 :(得分:2)

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

例如,如果您在CAT规则之后将DOG定义为另一个终端规则,那么元素RAT与CAT RULE“冲突”并使用新行将其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
;