第四章++语法分析(1)

合集下载

第四章语法分析

第四章语法分析



最右推导
E rm E rm (E) rm (E + E) rm (E + id) rm (id + id)
4.1 上下文无关文法
4.1.3 分析树 例 E E + E | E E | (E ) | E | id
E

E
( E ) E + E id
id
4.1 上下文无关文法

4.2 语言和文法
4.2.7 提左因子

有左因子的文法 A b1 | b2 提左因子 A A A b 1 | b 2

4.2 语言和文法

例 悬空else的文法 stmt if expr then stmt else stmt | if expr then stmt | other 提左因子

无二义的文法
stmt matched _stmt | unmatched_stmt matched_stmt if expr then matched_stmt else matched_stmt | other unmatched_stmt if expr then stmt | if expr then matched_stmt else unmatched_stmt
句型 文法G的开始符为S,S *, 可能含有非终结符, 则叫做文法G的句型。
4.1 上下文无关文法

例 E E + E | E E | (E ) | E | id 最左推导
E lm E lm (E) lm (E + E) lm (id + E) lm (id + id)

按串长进行归纳:配对括号串可由S推出

语法分析(1)

语法分析(1)

5
语言
• 语言:对字母表Σ来说,Σ*上的任意一个子集都
称为Σ上的一个语言,记为L(L Σ*)
• 句子:语言L的每一个字符串称为该语言的一个
语句或句子。 • 例:字母表{0,1}上的语言
{0,1} {00,11} {0,1,00,11} {0,1,00,11,01,10} {00,11}* {01,10}*
例:构造产生标识符的文法(续)
• 作为“标识符”的非终结符I,它或者是一 单个字母,或者为一字母后跟字母数字串, 即 I→L∣LS 因此,产生标识符的文法G[I]为: G=({a,b,…,z,0,…,9},{I,S,T,L,D},I,ξ)
ξ: I→L∣LS
S→T∣ST T→L∣D L→a∣b∣…∣z D→0∣1∣…∣9
构造产生标识符的文法标识符是以字母开头的字母数字串用l表示字母类非终结符用d表示数字类非终结符而用t表示字母或数字类非终结符则如果用s表示字母数字串类则t是一字母或数字st也是字母数字串即有stst产生式stst是一种左递归形式由它可以产生一串t
编译原理 第4讲 语法分析(1)
贾西平 Email: jiaxp@
M B DD … D A
中间位 最 高 位 最 低 位
14
例3.2
• 由于中间部分可出现任意位,所以 另引入了一个非终结符M,它包括 M 最高位和中间位部分。假定开始符 B DD … 为N,则可得到文法G[N]为: • G=({0,1,„,9},{N,A,M,B,D},N,ξ) ξ:N→A∣MA /*一位数字│多位数字*/ M→B∣MD /*仅两位数字(无中间位)│
17
推导符号
• 通常,用 1 n 表示:从1出发,经过 一步或若干步,可以推出n。 用 1 n 表示:从1出发,经过0步或 若干步,可以推出n。

编译原理第4章 语法分析——自上而下分析

编译原理第4章 语法分析——自上而下分析

17
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
分析输入串x*y(记为)。
x*y
S
IP x A y **
18
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
分析输入串x*y(记为)。
x*y
S
IP x A y **
19
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
(4.3)
虽没有直接左递归,但S、Q、R都是左递归的
SQcRbcSabc
一个文法消除左递归的条件
丌含以为右部的产生式
丌含回路
PP
30
例 文法G(S): S→Qc|c Q→Rb|b R→Sa|a
(4.3)
虽没有直接左递归,但S、Q、R都是左递归的
SQcRbcSabc
Q
Q

S
R
S→Qc|c Q→Rb|b R→Sa|a
35
例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
消除S的直接左递归后: S→abcS | bcS | cS S→abcS | Q→Sab |ab | b R→Sa|a
关于Q和R的觃则已是多余的,化简为:
S→abcS | bcS | cS
S→abcS |
(4.4)
36
注意,由于对非终结符排序的丌同,最 后所得的文法在形式上可能丌一样。但 丌难证明,它们都是等价的。
分析输入串x*y(记为)。
x*y
S
IP
15
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
分析输入串x*y(记为)。

第四章 语法

第四章 语法

例句分析:
(1)太阳升起在浩荡的平原上。 (2)我们充分利用本地资源制造农业机械化的道路。 (3)在参观期间发生的令人感动的美丽事情层出不穷。 (4)其实对这一点我也以前不十分清楚。 (5)尽管天塌下来,我也能顶得住。 (6)我看书的入神时,不时门开了,好几个同学进来。
二、 语法的组合规则和聚合规则
2. 划分词类应注意的问题 ①在鉴别词类时可以参照词的意义,但不能完全根据意义,而 要有句法功能和形式上的实证。 ②在同一个词类当中,具体的成员有典型与非典型之分。 ③一个词可以兼属两个或两个以上的词类。
3.划分词类对句法描写的意义 划分词类是概括句法格式、发现组合规则的基础。词类 之于句法描写的重要性还表现为,给词分小类可以大大深化 句法描写。
第四章 语法
第一节 语法和语法单位 第二节 组合规则 第三节 聚合规则 第四节 变换 第五节 语言的结构类型和普遍特征
第一节 语法和语法单位
一 语言结构是有规则的
所谓语法,是指用词造句的规则。我们说话写文章都必 须遵守规则,否则的话,就会让对方感到别扭甚至产生误会 。 作为母语的语法规则是潜存于大脑的,通过说话可以表 现出来,但是规则具体是怎样的,一般人却难以说明白。语 法分析的主要任务就是把人们心知其意而难以言状的规则整 理出来,以便人们自觉的运用。语法学家的任务只是归纳、 整理客观存在的规则,选择恰当的方式进行描写,对于语法 规则,语法学家是无权做硬性的规定的。
四、 语法范畴
由词的变化形式所表示的意义方面的聚合,即语法意 义的类就叫做语法范畴。 (一)语法范畴的类: 体词属性范畴和谓词属性范畴 1. 体词属性范畴 就是由名词的词性变化形式表示的意义。印 欧语系的语言中的名词大都有词形变化,主要表示三种范 畴意义:性、数、格。

语法分析

语法分析
23
if(Yi∈VN) { if(i=n or 任一j(i+1≤j≤n)null(Yj)=true) FOLLOW(Yi)=FOLLOW(Yi)∪FOLLOW(A); if(Yi+1∈VT) Yi+1∈FOLLOW(Yi); else for(k=i+1;k<=n;k++) if(k=i+1 or i+1≤j≤k-1)null(Yj)=true ) FOLLOW(Yi)=FOLLOW(Yi)∪FIRST(Yk) }/*end of if*/ }/*end of for*/ } /*end of for*/ while FIRST,FOLLOW,nullable 不再改变
1、思路:对任一输入符号串,通过一切可能的办 法,从树根结点(识别符号)出发,根据文法自 上而下地为输入串建立一棵语法树;或者说, 从识别符号开始,根据文法试图为输入串建立 一个推导序列。 2、特点:是自顶向下分析的一般方法,分析过程 的本质是一种试探过程。
4
例∶假定有文法G[S]:(1)S->cAd (2)A->ab|a 对输入串w=cad。要求自上而下地构造w的语法树。 解决过程: S c a S c A a d A b d -对于输入串w,从文法的开始符号出 发,反复使用不同的产生式谋求匹配 输入串。当用某个非终结符号的候选 式进行匹配失败时,则推翻分析退回 到适当位置再重新试探其它候选式, 直到把所有可能的推导序列都试探完 仍不成功才能确认输入串不是该文法 的句子而报错 。称为带回溯的自顶 向下分析。 -回溯需要推导记住现场,浪费了大量 的时间和空间,必须设法消除。
在推导过程中,可以完全根据向前看符号唯 一决定选择哪个产生式往下推导,因此,分析过 程是完全确定的。这种分析称为确定的自顶向下 分析方法。

编译技术-第4章-语法分析(一)

编译技术-第4章-语法分析(一)
基本任务:识别符号串S是否为某语法成分。 两大类分析方法:
自顶向下分析 自底向上分析
自顶向下分析算法的基本思想为:
若Z + S 则 S L(G[Z]) 否则 S L(G[Z])
G[Z]
主要问题: ➢ 左递归问题 ➢ 回溯问题
▪ 主要方法: • 递归子程序法 • LL分析法
自底向上分析算法的基本思想为:
第四章 语法分析
• 语法分析的功能、基本任务 • 自顶向下分析法> • 自底向上分析法>
复习:第一章 概述
编译过程是指将高级语言程序翻译为等价的目标程 序的过程。 习惯上是将编译过程划分为5个基本阶段:
词法分析 语法分析 语义分析、生成中间代码 代码优化 生成目标程序
4.1 语法分析概述
功能:根据文法规则,从源程序单词符号串中识别出语法 成分,并进行语法检查。
若有规则:U∷=x|xy 则可以改写为:U∷=x(y|ε) 注意:不应写成U∷=x(ε|y)
使用提因子法,不仅有助于消除直接左递归,而且有 助于压缩文件的长度,使我们能更有效地分析句子。
规则二
若有文法规则:U∷=x|y|……|z|Uv
其特点是:具有一个直接左递归的右部并位于最后, 这表明该语法类U是由x或y……或z其后随有零个 或多个v组成。
若Z + S
G[Z]
则 S L(G[Z]) 否则 S L(G[Z])
主要问题: ➢ 句柄的识别问题
▪ 主要方法: • 算符优先分析法 • LR分析法
4.2 自顶向下分析
4.2.1 自顶向下分析的一般过程
给定符号串S,若预测是某一语法成分,则可根据该 语法成分的文法,设法为S构造一棵语法树, 若成功,则S最终被识别为某一语法成分,即

第四章 语法分析——自上而下分析

第四章 语法分析——自上而下分析

解二: 规定顺序:S、Q、R
则等价的无左递归的文法: SQc | c QRb| b RbcaR’ | caR’ | aR’ R’bcaR’ |
RSa | a RQca | ca | a
RRbca|bca | ca | a
RbcaR’|caR’ | aR’ R’ bcaR’|
(因为不需要试探某个候选式,而是准确地指派 某个候选式)
17
终结首符集FIRST
令文法G不含左递归,对它的所有非终结符的每 个候选式定义终结首符集 FIRST(): * FIRST()={a | a , a∈VT }
特别地 * 若 ,则规定 ∈ FIRST()
显然, FIRST()是从推导出的所有可能的开头终 结符a或 。
3
§4.2 自上而下分析面临的问题
一、带‚回溯‛的自上而下分析方法:
自上而下分析方法,就是对任何输入串,试 图用一切可能的方法,从文法的开始符号出发, 自上而下地为输入串建立一个语法树(或最左推 导)。 这种分析过程实质上是一种试探过程,即反 复使用不同的产生式以求能匹配输入串。
4
例4.1 设有文法: SxAy
解: S iCtSA | a
A | eS
C b
22
4.3.3 LL(1)分析条件 当一个文法不含左递归,并且满足每个非终结 符的所有候选首符集两两不相交,是不是一定能进 行有效的自上而下的语法分析呢?
若存在 ∈ FIRST() ,则问题较复杂,需要进 一步考虑。 定义:非终结符A的 FOLLOW 集:
* FOLLOW(A)= { a| S …Aa… ,a∈VT } 特别地, * 若S …A,则规定,构造FIRST(X)
a) 若X∈VT,则 FIRST(X)={X}。

917405-编译技术-电子教案-第4章-语法分析(一)

917405-编译技术-电子教案-第4章-语法分析(一)

北京航空航天大学计算机学院
5
4.2 自顶向下分析
4.2.1 自顶向下分析的一般过程
给定符号串S,若预测是某一语法成分,则可根据该 语法成分的文法,设法为S构造一棵语法树, 若成功,则S最终被识别为某一语法成分,即
SL(G[Z]),其中G[Z]为某语法成分的文法 若不成功, 则 SL(G[Z])
• 可以通过一例子来说明语法分析过程
26
2.超前扫描
当文法不满足避免回溯的条件时,即各选择的首符号相 交时,可以采用超前扫描的方法,即向前侦察各输入符 号串的第二个、第三个符号来确定要选择的目标
这种方法是通过向前多看几个符号来确定所选择的目 标,从本质上来讲也有回溯的味道,因此比第一种方 法费时,但是假读仅仅是向前侦察情况,不作任何语 义处理工作。
a. 改写以后的文法消除了左递归。 b. 可以证明,改写前后的文法是等价的,表现在
L(G改前) = L(G改后)
如何改写文法能消除左递归,又前后等价, 可以给出两条规则:
北京航空航天大学计算机学院
12
规则一(提因子)
若:U∷=xy|xw|….|xz 则可改写为:U∷=x(y|w|….|z) 若:y=y1y2, w=y1w2 则 U∷=x(y1(y2|w2)|….|z)
改写文法: <程序> ∷= begin (<说明串>;<语句串> end | <语句串> end )
引入 <程序*> <程序> ∷= begin <程序*> <程序*> ∷= <说明串>;<语句串> end | <语句串> end
北京航空航天大学计算机学院

自上而下分析与LL(1)分析法(1)

自上而下分析与LL(1)分析法(1)
8
4.1 语法分析器的功能
语法分析的任务
分析一个文法的句子结构
语法分析器的功能
按照文法的产生式(语言的语法规则),识别输 入符号串是否为一个句子(合式程序)
9
单词符号
语法分
源程序 词法分
语法分 析树 编译程序
析器
析器
取下一单词
后续部分
... 符号表
10
语法分析的方法
自下而上分析法(Bottom-up)
小结
自上而下分析面临的问题
文法的左递归性 回溯
消除文法的左递归
直接左递归的消除 间接左递归的消除
38
13
4.2 自上而下分析面临的问题
自上而下就是从文法的开始符号出发,向 下推导,推出句子
自上而下分析的主旨
针对输入串,试图用一切可能的办法,从文法 开始符号(根结点)出发,自上而下地为输入串 建立一棵语法树
为输入串寻找一个最左推导
14
例3.4.1 假定有文法G(S): (1) S→xAy (2) A→**|*
Q→Sab |ab | b
R→Sa|a
33
例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
S→QSacb|cc | abc | bc | c Q→Sab |ab | b R→Sa|a
令它的非终结符的排序为R、Q、S Q的规则变为
Q→Sab | ab | b
现在的Q不含直接左递归,把它代入到S 的有关候选后,S变成
...a...
含有左递归的 文法将使自上 而下的分析陷 入无限循环!
...
24
第四章 语法分析—自上而下分析
语法分析器的功能 自上而下分析面临的问题 LL(1)分析法 递归下降分析程序构造 预测分析程序

04 语法分析(1) _ 概述(含 消除左递归)

04  语法分析(1) _ 概述(含 消除左递归)

消除间接左递归的方法:
(1) 把间接左递归文法改写为直接左递归文法;
(2) 用消除直接左递归的方法改写文法。
下面给出一个消除文法所有左递归性的算法,该算
法对文法的要求是:文法不含回路(形如PP的
推导),且不含以ε为右部的产生式。
通用算法
• 阅读 P84 算法4.1
①把G的非终结符按任意顺序排列,如A1,…,An ②for(i=1;i<=n;i++)
0 1
q0
1
q1

q2
【定义】一个下推自动机可定义为一个7元组:
PDA M=(Q, , , q0, Z0, F, )
其中: ① Q是有限状态集; ② 是输入符号集; ③ 是栈符号集; ④ q0Q,称为起始状态; ⑤ Z0,称为栈起始符; ⑥ FQ,称为接受状态集; ⑦ 是转移函数,定义域为Q×({ε})×,且表示由 “当前状态qi、输入符号a和栈顶符号x决定PDA的转 移动作”。值域为Q×*,指明下推自动机的动作结 果包括“状态转移和栈操作”。
例4.6
设有文法G: I→I0 | Ia | Ib | a | b
对左递归文法G改写后的文法G'为 I → aI' | bI' I ' → 0I' | aI' | bI' |ε
习题 4.8
将下面的左递归文法G(S)改为非左递归的。
S → SaP|Sf |P P → QbP|Q Q → cSd|e 【解】 S → PS’ S’→ aPS’| f S’|ε P → QbP|Q Q → cSd|e
第4章 语法分析
—— 自顶向下分析法
思考题
上次课所留问题:
设计例3-3的词法分析程序。

自上而下语法分析

自上而下语法分析
从推导的角度看,从开始符号出发,使用最左 推导,试图推导出与输入符号串相同的句子。
从语法树的角度看,从根节点出发,反复使用 所有可能的产生式,谋求输入串的匹配,试图 向下构造一棵语法树,其末端节点正好与输入 符号串相同。
需要反复试探。
复习
句型的推导
最左(最右)推导:在推导的任何一步α β , 其中α 、β 是句型,都是对α 中的最左(右)非 终结符进行替换 最右推导被称为规范推导。 由规范推导所得的句型称为规范句型。
例1:判定输入串(i+i)*i是否是下述文法的句子?
G = ({E}, {i, +, *, (, ) } , P , E) P: E E + E E E*E E (E) Ei
解:使用最左推导:
E E*E (E)*E (E + E)*E (i + E)*E
(i + i)*E (i + i)*i
高级语言的语法结构适合用上下文无关文法 来描述,上下文无关文法是语法分析的基础。
语法分析在编译系统中所处的位置
语法分析的接口设计
源程序 词法分析器 token串
语法分析器 语法分析树
编译程序 后续部分
• 语法分析器的输入
– Token序列:词法分析的输出,是各个单词都正 确的源程序的变换形式,是一个有限序列
• 语法分析器的输出
– 分析树:表示方法? 见教材 P89 – 错误处理信息:定位、继续编译
语法分析器的功能
按照语言的语法构成规则, 识别输入的符号 串能否构成一个句子。这些规则是用文法的 产生式来定义的。
问题
对给定的一个输入串,如何判定它是不是一 个句子?
方法

编译原理第四章语法分析-自上而下分析

编译原理第四章语法分析-自上而下分析

• 例 4.4
4.4 递归下降分析程序构造
• 递归下降分析器:
这个分析程序由一组递归过程组成的,每个过程对应 文法的一个非终结符。 E→TE’ E’→+TE’| T→FT’ T’→*FT’| F→(E)|i
PROCEDURE E BEGIN T ; E’ END PROCEDURE E’ IF SYM=‘+’THEN BEGIN ADVANCE ; T ; E’ END
4.2 自上而下分析面临的问题
• 例4.1 假定有文法
(1) SxAy (2)A**|*
对输入串x*y,构造语法树。 • 构造过程:
(1)把S作为根 (2)用S的产生式构造子树 (3)让输入串指示器IP指向输入串的第一个符号。
S x A y x
S
A y x
S
A y
*
*
*
(4)调整输入串指示器IP与叶结点进行匹配。 (5)如果为非终结符,用A的下一个产生式构建子树。 (6)如果匹配成功则结束;否则,回溯到步骤(4)。
• 一个反例:
– 文法:SQc|c;QRb|b;RSa|a虽然不是直接 左递归,但S、Q、R都是左递归。
• 消除左递归算法:
– 算法的思想是:
• • • • 首先构造直接左递归; 再利用一般转换规则,消除直接左递归 化简文法。 下面算法在不含PP,也不含在右部产生式时可以消除 左递归。
• 消除一个文法的左递归算法:
(1) 把文法 G 的所有非终结符按任一种顺利排列成 P1…Pn;按此顺序执行; (2) FOR i:=1 TO n DO
BEGIN FOR j:=1 TO i-1 DO 把形如Pj+1→Pj 的规则改写成 Pj+11|1|…k| 。其中 Pj1|1|…k 是关于 Pj 的 所有规则; 消除关于Pi规则的直接左递归性。 END 化简由(2)所得的文法。即去除那些从开始符号出发永 远无法到达的非终结符的产生规则。

第章语法分析——自顶

第章语法分析——自顶

4.2.1 FIRST集合定义及构造方法
对 于 文 法 G 的 任 一 符 号 串 α=X1X2…Xn 可 按 下 列 步 骤 构 造 其 FIRST(α)集合: 1)置FIRST(α)=φ 2)将FIRST(X1)中的一切非ε符号加进FIRST(α); 3) 若 ε∈FIRST(X1) , 将 FIRST(X2) 中 的 一 切 非 ε 符 号 加 进 FIRST(α) ; 若 ε∈FIRST(X1) 和 FIRST(X2) , 将 FIRST(X3) 中 的一切非ε符号加进FIRST(α);余类推。 4) 若 对 于 一 切 1≤i≤n , ε∈FIRST(Xi) , 则 将 ε 符 号 加 进 FIRST(α)。
U
INPUTSYM =‘b’ Y
N 语法错误: 输入串少‘b’
出口
图4.1(a) 非终结符号Z的分析程序
4.3.1 递归下降分析的基本方法
U::=dZ|e
过程U
INPUTSYM =‘d’ N Y
INPUTSYM=下一个符号
Z
INPUTSYM =‘e’ Y
N PUTSYM=下一个符号
={+,),#} FOLLOW(F)= FIRST(T’) ∪ FOLLOW(T) ∪ FOLLOW(T’)
= {+,*,) ,# } FOLLOW(T’)= FOLLOW(T)= { + , ) , # }
4.3 递归下降分析
4.3.1 递归下降分析的基本方法
递归下降分析的概念极为简单,其方法是将文法中的每一个非终结符U的文 法规则看作是识别U的一个过程定义,为每个非终结符号构造一个子程序, 以完成该非终结符号所对应的语法成分的分析和识别任务。如果U的文法规 则的右部只有一个侯选式,则按从左向右的顺序依次构造规则U的识别过程 代码。如果有终结符号,判断能否与输入的符号相等,如果相等,表示识别 成功,读入指针指向下一个输入符号;如果不等,则意味着输入串此时有语 法错误。如果是非终结符号,则简单调用这个非终结符号的子程序,由这个 子程序完成该非终结符号所对应的语法成分的分析和识别任务。当一条规则 右部有多个侯选式时,则根据每个侯选式的第一个符号确定该侯选式分支。 只有被调用的分析和识别某语法成分的子程序匹配输入串成功,且正确返回 时,该语法成分才算真正获得识别。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
15
最左推导
最左推导:推导过程中任何一步推导α⇒β都是对α 中的最左非终结符进行替换。
E ⇒− E ⇒− ( E ) ⇒− ( E + E ) ⇒− (id + E ) ⇒− (id + id )
lm lm lm lm lm
如果α⇒β是最左推导,可以记为 α ⇒ β lm 如果 S ⇒ α
lm *
VT : 终结符集合 VN : 非终结符集合 S : 开始符号 P :产生式集合,产生式形式为:A → α,A∈VN, α
∈(VN∪VT )*
6
例4.2 定义算术表达式的文法
expr → expr op expr expr → (expr) expr → − expr expr → id op→ + | - | * | / | ↑
26
文法的二义性
二义性是文法的性质。程序设计语言是无二义的。 (自然语言本质是二义的,在一定语境下没有二义) 文法的二义性的消除:改写文法
27
4.2.6 验证文法产生的语言
例4.7 G : S → (S) S | ε L(G) = {配对的括号串的集合} 按推导步数进行归纳:推出的是配对括号串 归纳基础: S ⇒ ε 归纳假设:少于n步的推导都产生配对的括号串 归纳步骤:n步的最左推导如下: S ⇒ (S )S ⇒* (x) S ⇒* (x) y
7
4.2.2 符号的使用约定
我们一般用大写字母表示非终结符,小写字母表示 终结符,… Terminals: a, b, c, +, -, punc, 0, 1,…, 9, Black strings: id, if Non Terminals: A, B, C, S, italic strings 文法符号: X, Y, Z 终结符号串: u, v,…, z in VT* 文法符号串:α, β, γ in (VT ∪ VN)*
二义性的一些例子 I saw a man in the hill with a telescope. 球拍卖完了。 父在子先亡。
23
文法句子 有两个不同的最左推导: 文法句子id * id + id有两个不同的最左推导: 句子 有两个不同的最左推导
E⇒E*E ⇒ id * E ⇒ id * E + E ⇒ id * id + E ⇒ id * id + id E ⇒E+E ⇒ E * E +E ⇒ id * E + E ⇒ id * id + E ⇒ id * id + id
28
按串长进行归纳:配对括号串可由S推出 归纳基础: S ⇒ ε 归纳假设:长度小于2n的都可以从S推导出来 归纳步骤:考虑长度为2n(n ≥ 1)的w = (x) y S ⇒ (S )S ⇒* (x) S ⇒* (x) y
29
4.2.7 正规式和上下文无关文法
正规语言(RL)是上下文无关语言(CFL)的真子集, 正规表达式所描述的语言可以用上下文无关文法描 述。 将NFA转换为等价的CFG。
E E ( E ) E + E id id

20
最左推导构造的分析树 例4.5 从最左推导构造的分析树
E ⇒ − E E ⇒ − E E ( E ) ⇒ − E E ( E ) E + E ⇒ E E ( E ) E + E id ⇒ − E E ( E ) E + E id id 21

句型与分析树的关系
设串α是文法G的句型,则至少存在一棵分析树,它 的叶子从左至右排列恰好就是α。 注意,分析树的形状与推导顺序无关,而与在推导 时,所选择的对句型中的非终结符号进行替换的产 生式有关。 每棵分析树都有与之对应的唯一的最左推导和最右 推导。 但是,每个句子不一定只有唯一的分析树。
22
4.2.5 二义性
32
正规文法
若文法G = (VT, VN, S, P)中的每一个产生式形如: A → aB 或 A→a 其中A, B∈VN, a∈VT∪ {ε},则称G为右线性文法。 若文法G=(VT, VN, S, P)中的每一个产生式形如: A → Ba 或 A→a 则称G为左线性文法。 右线性文法和左线性文法都称为3型文法(正规文法)。
24
二义性用分析树表示比较直观
E⇒E* E ⇒ id * E ⇒ id * E + E ⇒ id * id + E ⇒ id * id + id E E id * E id E + E id E id E * E ⇒E+E ⇒ E * E +E ⇒ id * E + E ⇒ id * id + E ⇒ id * id + id E + E id E id
35
4.3.2 消除二义性
stmt → if expr then stmt | if expr then stmt else stmt | other
36
句型if 句型 E1 then if E2 then S1 else S2的分析树
Form 1:
if
stmt expr
then
stmt expr
33
4.3 文法的编写
文法的优点 文法给出了精确的,易于理解的语法说明 自动产生高效的分析器 可以给语言定义出层次结构 以文法为基础的语言的实现便于语言的修改 文法的问题 文法只能描述编程语言的大部分语法
34
4.3.1 为什么要用正规式定义词法? 为什么要用正规式定义词法
为什么不用CFG定义词法 词法规则非常简单,不必用上下文无关文法。 对于词法记号,正规表达式描述简洁且易于理解。 从正规表达式构造出的词法分析器效率高。 把词法分析从语法分析中分离出来的理由 简化设计 编译器的效率会改进 编译器的可移植性加强 便于编译器前端的模块划分
8
符号的使用约定
Alternatives of production rules: A→ α1; A→ α2; …; A→ αk; ⇒ A → α1 | α2 | … | αk First NT on LHS of 1st production rule is designated as start symbol !
25
文法的二义性
如果一个文法的句子存在两棵分析树,那么,该句 子是二义性的。 如果一个文法包含二义性的句子,则说这个文法是 二义性文法;否则说该文法是无二义性文法。 文法的二义性源于这样的事实,在一个句型中,存 在一个非终结符号A,对于它有两条产生式可用于 替换,但A的这些推导最终都产生相同的句型。
17
归约( 归约(reduce) )
定义:设α和β均为句型,若α⇒*β,则称β 可以归约为α。 规范(最右)推导的逆过程,称为规范归约。 语法分析的核心问题就是,对于一个终结符 号串x,设法从S推导出x,或者反过来,设 法将x归约为S。
18
4.2.4 分析树和推导
分析树是推导的图形表示。
19
-(id+id)的分析树 的分析树
30
将正规表达式(a|b)*ab用CFG表示
正规式 (a|b)*ab start 文法 A0 → a A0 | b A0 | a A1 A1 → b A2 A2 → ε
a 0 b a 1 b 2
31
构造规则
Each State i has non-terminal Ai i a j If then Ai →a Aj If i ε j then Ai →Aj If i is an accepting state, Ai → ε If i is a starting state, Ai is the start symbol
unmatched_stmt → if expr then stmt | if expr then matched_stmt else unmatched_stmt
38
4.3.3 消除左递归
文法左递归 A⇒+Aa 直接左递归 A→Aa |b 串的特点 ba . . . a 消除直接左递归 A → b A′ A′→ a A′ | ε
第四章 语法分析
1
本章内容
上下文无关文法 自顶向下分析和自底向上分析 LL文法和LR文法 Yacc
2
4.1 语法分析器的作用
源程序 词 法 分析器 语法分 语法 前端的 中间 树 其余部分 表示 取下一个 析器 记号 记 号
符号表
3
4.2 上下文无关文法
RE的局限性 正规式用于定义一些简单的语言,能表示给定 结构的固定次数的重复或者没有指定次数的重 复。 例:a(ba)5, a(ba)* 正规式不能用于描述配对或嵌套的结构,例:
39
例: 算术表达文法 E→E+T|T T→T*F|F F → ( E ) | id 消除左递归后文法 E → TE′ E′ → +TE′ | ε T → FT ′ T′ → *FT′ | ε F → ( E ) | id
(T+T...+T) (F*F...*F)
40
ቤተ መጻሕፍቲ ባይዱ
非直接左递归 S → Aa | b A → Sd | ε 先变换成直接左递归 S → Aa | b A → Aad | bd | ε 再消除左递归 S → Aa | b A → bd A′ | A′ A′ → adA′ | ε
,则称α是文法的左句型。
16
最右推导
类似的,可以定义最右推导:推导过程中任何一步 推导α ⇒ β都是对α中的最右非终结符进行替换。 最右推导也称作规范推导。
E ⇒ − E ⇒ − ( E ) ⇒− ( E + E ) ⇒ − ( E + id ) ⇒ − (id + id )
rm rm rm rm rm
then
相关文档
最新文档