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 + number
是 number + number + number
.
的前缀
解决此问题的常见解决方法是 "endmark" 您的语言,要求生成的所有字符串以特殊的 "done" 字符结尾。例如,您可以要求生成的所有字符串都以分号结尾。如果这样做,您可以使用以下语法为该语言构建 LR(0) 解析器:
S → E;
E → E + T | T
T → T * F | F
F → number | (E)
典型的 BNF 定义算术运算:
E :- E + T
| T
T :- T * F
| F
F :- ( E )
| number
有什么方法可以重写此语法,使其可以用 LR(0) 解析器实现,同时仍保留运算符的优先级和左结合性? 我认为应该可以通过引入某种消除歧义的非终端来实现,但我不知道该怎么做。
谢谢!
只有 无前缀 的语言才能具有 LR(0) 文法,这意味着该语言中的任何字符串都不是另一种语言的前缀。在这种情况下,您描述的语言不是无前缀的。例如,字符串 number + number
是 number + number + number
.
解决此问题的常见解决方法是 "endmark" 您的语言,要求生成的所有字符串以特殊的 "done" 字符结尾。例如,您可以要求生成的所有字符串都以分号结尾。如果这样做,您可以使用以下语法为该语言构建 LR(0) 解析器:
S → E;
E → E + T | T
T → T * F | F
F → number | (E)