📜  使用LR解析器解析歧义文法

📅  最后修改于: 2021-06-28 06:48:55             🧑  作者: Mango

LR解析器可用于解析歧义语法。 LR解析器根据语法的某些规则(运算符的优先级和/或关联性)解决歧义语法的解析表中的冲突(移位/减少或减少/减少)。

例子:
让我们采用以下模棱两可的语法:

E -> E+E
E -> E*E
E -> id 

假设语法的运算符(+和*)的优先级和关联性如下:

  • “ +”和“ *”都保持关联,
  • “ *”的优先级高于“ +”的优先级。

如果我们使用LALR(1)解析器,则LR(1)项DFA将为:

从LR(1)项DFA中,我们可以看到在状态I 5和I 6中存在移位/减少冲突。因此,解析表如下:

I 5和I 6中的“ +”和“ *”都有平移和减法移动。要解决此冲突,即确定从表中保留哪个动静并舍弃哪个动静,我们将使用运算符的优先级和关联性。
考虑输入字符串:

id + id + id 

让我们根据上面的解析表来看解析器移动到冲突状态。

  • 如果像解析器1那样在符号“ +”上进行I 5状态的减少移动,则输入字符串的左侧“ +”在右侧“ +”之前减小,这使“ +”与左侧关联。
  • 如果像解析器2一样在符号“ +”上进行I 5状态的移位,则输入字符串的右侧“ +”在左侧“ +”之前减小,这使“ +”与右侧关联。

类似地,对符号“ *”进行I 5状态的换档将使“ *”的优先级高于“ +”,因为“ *”将在“ +”之前减小。在符号“ *”上减少I 5状态的移动将使“ +”比“ *”具有更高的优先级,因为“ +”将在“ *”之前减小。与I 5相似,也可以解决来自I 6的冲突。

根据我们示例的优先级和关联性,可以按以下方式解决冲突,

  • 通过保持减少移动并放弃移动,可以解决I +上I 5上的移动/减少冲突,这使“ +”左键关联。
  • 通过保持移位移动并放弃减少移动来解决I 5上* /上的移位/归约冲突,这将使“ *”的优先级高于“ +”。
  • 通过保持减少移动并放弃移动,可以解决I +上I 6处的移动/减少冲突,这将使“ *”的优先级高于“ +”。
  • 通过保持减少移动并放弃移动,可以解决I *上* 6处的移动/减少冲突,这使“ *”左键关联。

通常,解析器生成器工具YAAC可以解决由于语法不明确引起的冲突,如下所示:

  • 解析表中的移位/减少冲突通过优先考虑移位移动而不是减少移动来解决。如果该字符串已接受换档移动,则将减小减音移动,否则将删除换档移动。
  • 解析表中的减少/减少冲突通过优先处理第一减少动作而不是第二减少动作来解决。如果该字符串已被接受作第一减法动作,则第二减法动作被去除,否则第一减法动作被去除。

相关的GATE问题:

  • GATE-CS-2005 |第85章
  • GATE-CS-2005 |第86章