2.5.2语法二义性设置语法G [ E ]:
ee|e * e|(e )| i语句I * I有两种不同的最左推导,对应两种不同的语法树。 参见图2.6和图2.7。
最左导出1
eeee*eI*eeI*I*IeI*II )最左推导2
e*eI*eI*eeI*IeI*II*II图2.6最左边引导1的语法树
图2.7从最左边推导2的语法树
图2.6的语法树先进行乘法运算,图2.7的语法树先进行加法运算,到底要进行什么样的运算呢? 这里出现的这种现象被称为语法的二义性。
如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义性的或若一个文法中存在某个句子,它有两个不同的最左(最右)推导,则这个文法是二义性的
上述语法G [ E ]是二义语法。
很明显,二义语法会给编译器的执行带来问题。 对于二义语法的句子,编译器对其结构进行语法分析会产生两种以上不同的理解。 语法结构上的不确定性会导致语义处理上的不确定性。 例如,在上述例子中,编译器分析语句i * i i时,是用图2.6进行分析,还是用图2.7进行分析? 为了使编译器对每个句子的分析都是唯一的,记述语言的语法最好没有二义性。 当然,关于二义语法,请参阅文法的等价性来消除文法的二义性