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

时间:2015-11-21 20:03:50

标签: parsing operators bnf lr associativity

典型的BNF定义算术运算:

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

有没有办法重写这个语法,所以它可以用LR(0)解析器实现,同时仍保留运算符的优先级和左关联性? 我认为通过引入某种消除歧义的非终端应该是可能的,但我无法弄清楚如何去做。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

  

S→E;

     

E→E + T | Ť

     

T→T * F | ˚F

     

F→数字| (E)