二义性文法 如果一个文法可以为一个句子生成多颗不同的语法分 析树,则该文法为二义性文法 E E E E E E E EE E id 图45id+id*id的两棵语法树 通常情况下,我们需要无二义性的文法
二义性文法 如果一个文法可以为一个句子生成多颗不同的语法分 析树,则该文法为二义性文法。 通常情况下,我们需要无二义性的文法 26
消除文法的二义性 ●把二义性文法改写成无二义性文法 stmt if expr then stmt if expr then stmt else stmt I other if E then S else if E, then s2 else if erpr then stmt else if eapr then stmt else stmt
消除文法的二义性 把二义性文法改写成无二义性文法 27
stmt if expr then stmt I if expr then stmt else stmt other 消除文法的二义性(续) if E then if Ey then S, else S2
消除文法的二义性(续) 28
消除文法的二义性(续) ●改写文法,基本思想:在一个then和一个else之间出现的语 句必须是“已匹配的”。也就是说then和else中间的语句 不能以一个尚未匹配的then结尾。 ●解决方案:引入新的非终结符号,用来区分是否是成对的 then/else。 stmt matched stmt pen-stnt matched_stmt if eapr then matched_stmt else matched_stmt other pen-_stmt if expr then stmt if ecpr then matched_ stmt else open-stmt if E, then if E2 then S, else s2
消除文法的二义性(续) 改写文法,基本思想: 在一个then和一个else之间出现的语 句必须是“已匹配的”。也就是说then和else中间的语句 不能以一个尚未匹配的then结尾。 解决方案:引入新的非终结符号,用来区分是否是成对的 then/else。 29
消除文法的二义性示例2 E>E+EE-EEEJE/E (E) id E→E+T|E-T|T T→T*F|T/F|F F→(E)|id
消除文法的二义性示例2