典型的BNF定义算术运算:
E :- E + T
| T
T :- T * F
| F
F :- ( E )
| number
有没有办法重写这个语法,所以它可以用LR(0)解析器实现,同时仍保留运算符的优先级和左关联性? 我认为通过引入某种消除歧义的非终端应该是可能的,但我无法弄清楚如何去做。
谢谢!
答案 0 :(得分:1)
如果语言的前缀无,则语言只能有LR(0)语法,这意味着该语言中没有字符串是另一种语言的前缀。在这种情况下,您所描述的语言不是无前缀的。例如,字符串number + number
是number + number + number
的前缀。
解决这个问题的一个常见解决方法是" endmark"你的语言要求所有生成的字符串以特殊的"完成"字符。例如,您可能要求生成的所有字符串以分号结尾。如果这样做,您可以使用此语法为语言构建LR(0)解析器:
S→E;
E→E + T | Ť
T→T * F | ˚F
F→数字| (E)