1

我正在尝试制作一种没有运算符优先级的语法,但要求您使用一个运算符或将它们括在括号中。(为简单起见,在此处使用而test不是有效运算符列表)。例如:id|int_literal etc+

test + test ///valid!
(test + test) + test ///valid!
(test + test) + (test + test) /// valid!
test + test + test /// invalid!

有没有办法为此编写不需要回溯=真的语法?我不认为左分解在这里真的有意义,我不确定句法谓词会有什么帮助。

这是我所拥有的(需要backtrack=true):

fragment
bexpr : 'test' | '(' cbebr ')';

fragment
cbexpr : bexpr '+' bexpr;

expr : bexpr | cbexpr;
4

1 回答 1

1

您可能想查看如何从语法中删除全局回溯

模棱两可之处在于, 的两种选择都expr可以以 . 开头bexpr。你需要摆脱这种歧义。关键在于观察到 a+只有在它是整个表达式时才出现不带括号的情况。所以我们最终得到:

expr : operand ('+' operand)?;
operand : '(' expr ')' | 'test';

换句话说:如果运算符表达式作为操作数出现,那么它必须用括号括起来。

于 2012-05-07T02:17:07.877 回答