二义性(ambiguous)就是构造文法分析表中出现的移入/归约冲突或归约/归约冲突
二义文法的解决通常是通过增加附加条件的方法。
用优先级和结合性解决冲突
比如以下文法:
E -> E + E | E * E | ( E ) | id
这个文法存在二义性,因为没有指定*和+的优先级和结合性。
比如对于算式id + id * id,当输入乘号时,解析器不知道应该先将栈里的E+E归约,还是先将*移入栈中,并准备将这个*和其左右的id归约。
再比如对于算式id+id+id,前后两个+到底哪个先做归约呢?
通过确定*和+的优先级,我们可以解决第一个算式遇到的冲突。
通过确定左结合性,我们可以解决第二个算式遇到的冲突。
悬空else
在上面的代码中,else的匹配出现了冲突,这就是悬空-else二义性
解决悬空else问题可以增加的一个附加条件就是:else和距离其最近的if归约。