二义性(ambiguous)就是构造文法分析表中出现的移入/归约冲突或归约/归约冲突

二义文法的解决通常是通过增加附加条件的方法。

用优先级和结合性解决冲突

比如以下文法:
E -> E + E | E * E | ( E ) | id
这个文法存在二义性,因为没有指定*和+的优先级和结合性。
比如对于算式id + id * id,当输入乘号时,解析器不知道应该先将栈里的E+E归约,还是先将*移入栈中,并准备将这个*和其左右的id归约。
再比如对于算式id+id+id,前后两个+到底哪个先做归约呢?

通过确定*和+的优先级,我们可以解决第一个算式遇到的冲突。
通过确定左结合性,我们可以解决第二个算式遇到的冲突。

悬空else

第四章 LR二义文法的处理 [补]
在上面的代码中,else的匹配出现了冲突,这就是悬空-else二义性

解决悬空else问题可以增加的一个附加条件就是:else和距离其最近的if归约。

相关文章:

  • 2021-10-28
  • 2022-01-01
  • 2021-07-10
  • 2021-05-14
  • 2021-12-29
  • 2022-02-10
  • 2022-12-23
  • 2021-09-08
猜你喜欢
  • 2021-10-23
  • 2022-12-23
  • 2022-01-19
  • 2021-04-29
  • 2021-11-24
  • 2021-10-27
相关资源
相似解决方案