第4课 第3章_文法和语言_二义性&规则实践
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下一步,是消除二义性。考 S A | AB | B 虑到a总出于少数地位,我 们用最近嵌套法:a必须与 A aAb | ab 最近的未匹配的b匹配。有: B Bb |
9
课后作业
消除二义性
S SS | iS | iMe | M iMeM |
**尝试写出C语言表达式的结构规则
7
补充说明
关于上一页的改进文法 S→ε |SS|iS|iMe M→ε |iMeM 仍然是一个二义的,iie仍然是二义的。 考虑一下如何消除???
8
例子
L a b | m n 0
n m
已知如上所示语言,构造一个无二义文法 。 解:该语言是形如a…ab…b的集合,且b的数目 不少于a。易得到如下文法:S→ε |aSb|Sb,它 是二义的,例如abb就有两棵树。
不存在通用方法判断一个文法是否为二义; 不存在通用方法消除二义性。
3
消除二义性方法
优先级联 左结合或右结合 最近嵌套匹配
4
优先级联
曾经出现过的表达式文法:E → a | E+E | E*E | (E),对于 a*a+a,它有两棵树,上课已经谈过。 E E 此处,我们可以引入优先级来消 除二义性。习惯性的,我们规定“*” E+ E E* E 的级别高于“+”。可以得到如下文 法: E * E a a E+ E E → E+E | T a a a T → T*T | (E) | a a 那么,我们所得到的类似于哪一 个?
10
考虑这样一个文法: S→SS|iS|iSe|ε
S
S
i S e 它是if语句的一个抽象,我们可以看到 i S 类似iie、iei、iiee都是合法的,而 i S e i S ei,iee都是非法的。但是,iie是二义 的(正如上一课所显示的例子一样)。 ε ε 这里解决的方法是规定:e(else) 总是和最近的未配对的i(if)匹配。这样, S→SS|iS|iMe|ε 右边的树是正确的。我们可以有如右的文 法: M→ε |iMeM
5
左结合
上一页的文法 E → E+E | T T → T*T | (E) | a 仍然是二义的,形如“a+a+a”的串
E E+ E
E E+ E T E+ E a T T a
E + E T
T T a a
此处,如果规定”+”符合左结 合,希望只有左边是合法的。
a
a
为什么得不到右树, 请思考一下
6
最近嵌套匹配
第3章 文法和语言
二义的简洁性
S if S if
S if S if e e
ቤተ መጻሕፍቲ ባይዱ
e S e S else S
S S
else
S
2
有关二义性的几个结论
二义性对程序设计来说是有害的,应当避免。 有时,二义文法更加直观更加容易写出,例如 上课当中的if语句。因此,我们需要将二义文 法改造成无二义的,或者说消除其二义性。 出于简洁的目的,程序中允许出现二义文法, 但是附加某些规则,使其对应于无二义文法 遗憾的有如下两条: