这是一个示例语法:
语法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规则冲突)
答案 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
;