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

Parsing LR(0)解析器的运算符优先级,parsing,operators,bnf,lr,associativity,Parsing,Operators,Bnf,Lr,Associativity,定义算术运算的典型BNF: E :- E + T | T T :- T * F | F F :- ( E ) | number 是否有任何方法可以重新编写此语法,以便可以使用LR(0)解析器实现它,同时仍然保留运算符的优先级和左关联性? 我认为通过引入某种非终端的消歧方法应该是可能的,但我不知道怎么做 谢谢 一种语言只有在没有前缀的情况下才能有LR(0)语法,这意味着该语言中没有字符串是另一种语言的前缀。在本例中,您描述的语言不是无前缀的。例如,字符串number+number

定义算术运算的典型BNF:

E :- E + T
  |  T
T :- T * F
  |  F
F :- ( E )
  | number
是否有任何方法可以重新编写此语法,以便可以使用LR(0)解析器实现它,同时仍然保留运算符的优先级和左关联性? 我认为通过引入某种非终端的消歧方法应该是可能的,但我不知道怎么做


谢谢

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

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

→ E

E→ E+T | T

T→ T*F | F

F→ 编号|(E)


我已经有一段时间没有做语法分析器理论了,但这不是已经是一个lalr(1)语法了吗?(如果是这样的话,创建lr(0)解析器不就是在埋头苦干吗?)。我很好奇是否有任何解决方法来转移/减少此类问题。似乎要为简单的算术实现LALR有很多麻烦。。。