c语言表达式出现二义性,第8课 第3章_文法和语言_二义性&规则实践.ppt

第8课第3章_文法和语言_二义性&规则实践.ppt

共10页 第3章 文法和语言 湖南师范大学《编译原理》 授课教师:罗迅 二义的简洁性 有关二义性的几个结论 二义性对程序设计来说是有害的,应当避免。 有时,二义文法更加直观更加容易写出,例如上课当中的if语句。因此,我们需要将二义文法改造成无二义的,或者说消除其二义性。 出于简洁的目的,程序中允许出现二义文法,但是附加某些规则,使其对应于无二义文法 遗憾的有如下两条: 不存在通用方法判断一个文法是否为二义; 不存在通用方法消除二义性。 消除二义性方法 优先级联 左结合或右结合 最近嵌套匹配 优先级联 左结合 上一页的文法 E → E+E | T T → T*T | (E) | a 仍然是二义的,形如“a+a+a”的串 最近嵌套匹配 考虑这样一个文法: S→SS|iS|iSe|ε 它是if语句的一个抽象,我们可以看到 类似iie、iei、iiee都是合法的,而 ei,iee都是非法的。但是,iie是二义 的(正如上一课所显示的例子一样)。 这里解决的方法是规定:e(else)总是和最近的未配对的i(if)匹配。这样,右边的树是正确的。我们可以有如右的文法: 补充说明 关于上一页的改进文法 S→ε|SS|iS|iMe M→ε|iMeM 仍然是一个二义的,iie仍然是二义的。 考虑一下如何消除??? 例子 课后作业 消除二义性 **尝试写出C语言表达式的结构规则 * * 曾经出现过的表达式文法:E → a | E+E | E*E | (E),对于a*a+a,它有两棵树,上课已经谈过。 此处,我们可以引入优先级来消除二义性。习惯性的,我们规定“*”的级别高于“+”。可以得到如下文法: E → E+E | T T → T*T | (E) | a 那么,我们所得到的类似于哪一个? E E E + E E * a a a E E E * E E + a a a E E E + E E + a a a E E E + E + a a E a 此处,如果规定”+”符合左结合,希望只有左边是合法的。 T T 为什么得不到右树, 请思考一下 T T T T S i e S i S ε S i S i S e ε S→SS|iS|iMe|ε M→ε|iMeM 已知如上所示语言,构造一个无二义文法 。 解:该语言是形如a…ab…b的集合,且b的数目不少于a。易得到如下文法:S→ε|aSb|Sb,它是二义的,例如abb就有两棵树。 下一步,是消除二义性。考虑到a总出于少数地位,我们用最近嵌套法:a必须与最近的未匹配的b匹配。有:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值