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章