有人可以解释为什么这是一个含糊不清的语法? 我有一个相当精细的语法并且已经解决了我对此的错误:
Expressions:
AdditionOrSubtraction;
AdditionOrSubtraction:
UnaryExpression ((PLUS | MINUS) UnaryExpression)*
;
UnaryExpression:
MINUS Expressions
| Atom
;
Atom returns Expression:
INT
;
我查看了java规范,它给出了类似的表达式: http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-MultiplicativeExpression
我简化了它并在下面显示:
MultiplicativeExpression:
UnaryExpression
MultiplicativeExpression * UnaryExpression
MultiplicativeExpression / UnaryExpression
MultiplicativeExpression % UnaryExpression
UnaryExpression:
+ UnaryExpression
- UnaryExpression
Literal
Literal:
IntegerLiteral
尝试运行时收到以下错误消息: "决策可以匹配输入,例如" RULE_MINUS {RULE_MINUS,......}"使用多种选择:1,2 结果,替代品(s)2被禁用了该输入"
答案 0 :(得分:3)
你的语法很模糊,因为它可以解析成两个不同的,同样有效的树。请考虑输入1 - 2 - 3
。有可能以两种方式阅读它(添加了parethesis以强调不明确的先例:
您需要将其修改为
UnaryExpression: MINUS Primary | Primary;
Primary: '(' Expressions ')' | Atom;
消除歧义。