【发布时间】:2014-01-07 13:27:46
【问题描述】:
我想要实现的是一个 Xtext 语法,它能够区分 int 和 float 类型的负数。
当我遇到与eclipse community 相同的术语问题时,我遵循了他们的建议,将两者都写为数据类型规则:
SignedInteger returns ecore::EIntegerObject:
'-'? INT;
SignedFloat returns ecore::EFloatObject:
'-'? INT* '.' INT+;
但是上面会给我以下错误(最后我有同样的问题,前导减号):
Decision can match input such as "RULE_INT" using multiple alternatives: 1, 2
为了解决这个问题,我可以将两者都写成终端规则,但随后语法会发生冲突:
The following token definitions can never be matched because prior tokens
match the same input: RULE_INT
因为这两个规则都隐藏在 Xtext common terminals 规则 INT 后面。
似乎其中一个问题的解决方案会导致与另一个问题发生冲突。有什么建议可以解决这个问题吗?
除了另一个关于 ecore 数据类型的问题:你会推荐什么返回类型,EInt 和 EIntegerObject 有什么区别? (第二个是原始类型的包装类吗?)
【问题讨论】:
-
stackoverflow.com/questions/18089514/… 的重复 - 我想,接受的答案也适合你。
-
好的,我像这样调整了我的语法:
terminal INTEGER returns ecore::EInt : '-'? DIGIT+ ;但即使在我将所有INTs替换为INTEGER之后,我仍然会收到一个我不明白的...prior tokens match the same input: RULE_INT错误。是什么迫使这些错误?你能提供更多提示吗?请寻找什么。 -
将
INT重新定义为片段DIGIT是什么意思?对我来说,在INTEGERRule 中用INT替换DIGIT+看起来是一样的。但不幸的是,两者都不起作用。