【问题标题】:Xtext grammar of negative numbers: terminal vs datatype rules负数的 Xtext 语法:终端与数据类型规则
【发布时间】:2014-01-07 13:27:46
【问题描述】:

我想要实现的是一个 Xtext 语法,它能够区分 intfloat 类型的负数。

当我遇到与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+ 看起来是一样的。但不幸的是,两者都不起作用。

标签: eclipse grammar xtext


【解决方案1】:

我通过removing with 通用终端语句解决了这个问题。并将我需要的其余部分(没有 INT 规则)复制到我自己的语法中。这样就没有冲突了。

但我想这并不是问题的根源...... 如果有人能解释这里发生了什么,我将不胜感激。 (我希望这种方式不会带来以后的问题)

【讨论】:

    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多