LR(0)解析器中的Postfix和右关联运算符

时间:2012-08-29 09:37:47

标签: parsing lexer postfix-notation lr associativity

是否可以构造一个可以用前缀和后缀运算符解析语言的LR(0)解析器?例如,如果我的语法带有+(加法)和! (阶乘)运算符通常优先于1 + 3!应该是1 + 3! = 1 + 6 = 7,但是如果解析器是LR(0),那么当它在堆栈上有1 + 3时它会减少而不是移位吗?

另外,右关联运算符会造成问题吗?例如,2 ^ 3 ^ 4应该是2 ^(3 ^ 4)但是再次,当解析器在堆栈上有2 ^ 3时,它如何知道减少或移位?

如果这是不可能的,还是有办法使用LR(0)解析器,可能通过改变语法在适当的位置添加括号?

1 个答案:

答案 0 :(得分:0)

LR(0)解析器有一个缺点,即它们只能解析无前缀语言,语言中没有字符串是任何其他语言的前缀。这通常会使解析像这样的表达式有点棘手,因为类似5的东西是5!的前缀。这也解释了为什么很难得到正确的关联运算符 - 给出类似

的生产
  

S→F | F ^ S

解析器在看到F后会发生移位/缩小冲突,因为它无法判断是扩展还是再次降低。这与前面提到的无前缀属性有关。

LR(0)的这个弱点是人们在实践中不使用它的原因之一。 SLR(1)和LALR(1)解析器通常可以解析这些语法,因为它们具有前瞻标记,可以让它们决定是移位还是缩小。在上面的例子中,解析器不会遇到移位/减少冲突,因为在决定是否减少F或移位a ^时,他们可以看到移位^,因为没有正确的字符串,其中^应该出现在S.之后/ p>