LR(0) 解析器的运算符优先级

Operator precedence with LR(0) parser

典型的 BNF 定义算术运算:

E :- E + T
  |  T
T :- T * F
  |  F
F :- ( E )
  | number

有什么方法可以重写此语法,使其可以用 LR(0) 解析器实现,同时仍保留运算符的优先级和左结合性? 我认为应该可以通过引入某种消除歧义的非终端来实现,但我不知道该怎么做。

谢谢!

只有 无前缀 的语言才能具有 LR(0) 文法,这意味着该语言中的任何字符串都不是另一种语言的前缀。在这种情况下,您描述的语言不是无前缀的。例如,字符串 number + numbernumber + number + number.

的前缀

解决此问题的常见解决方法是 "endmark" 您的语言,要求生成的所有字符串以特殊的 "done" 字符结尾。例如,您可以要求生成的所有字符串都以分号结尾。如果这样做,您可以使用以下语法为该语言构建 LR(0) 解析器:

S → E;

E → E + T | T

T → T * F | F

F → number | (E)