在证明文法的二义性之前,我们需要熟悉几个基本的概念。
推导和语法树
推导
这里的推导,简单的来说就是指根据给出的句型(句子),对文法进行推理变化最终得到句型(句子)的过程。
其中,最左(右)推导是在每次推导的过程中,将最左(右)部的非终结符替换成目标句型的一部分,直到完全替换成目标句型。
例:有文法G[S]:
S—>AB
A—>bB
B—>a|Sb
对于句型baSb,
最左推导为:S=>AB=>bBB=>baB=>baSb
最右推导为:S=>AB=>ASb=>bBSb=>baSb
语法树
对句型的推导过程给出一种图形表示,这种表示成为语法树,也成为推导树。
例:对于上述文法的句型的语法树之一为:
文法二义性
如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义性的。具体来说就是一个一个文法的某个句子能有两个不同的最右(左)推导。证明了这一点,就可以说该文法是具有二义性的。
例:设有文法G[S]:S—>iSeS| iS | i ,证明文法G[S]有二义性
证明:(首先我们得自己假设一个句子,构建该句子的语法树)
设句子为iiiei ,则:
最右推导一:S=>iS=>iiSeS=>iiSei=>iiiei
最右推导二:S=>iSeS=>iSei=>iiSei=>iiiei
因此,该文法存在一个句子有两个不同的最右推导,具有二义性。
参考资料:编译原理(第四版)