1

一个典型的 BNF 定义算术运算:

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

有没有办法重写这个语法,以便它可以用 LR(0) 解析器来实现,同时仍然保留运算符的优先级和左关联性?我认为通过引入某种消歧非终端应该是可能的,但我不知道该怎么做。

谢谢!

4

1 回答 1

1

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

解决此问题的常见解决方法是通过要求生成的所有字符串以特殊的“完成”字符结尾来“标记”您的语言。例如,您可以要求生成的所有字符串都以分号结尾。如果你这样做,你可以用这个语法为语言构建一个 LR(0) 解析器:

S→E;

E → E + T | 吨

T → T * F | F

F → 数字 | (五)

于 2016-03-14T16:43:49.013 回答