第四章++语法分析(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)

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章 语法分析——自上而下分析

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,从文法的开始符号出 发,反复使用不同的产生式谋求匹配 输入串。当用某个非终结符号的候选 式进行匹配失败时,则推翻分析退回 到适当位置再重新试探其它候选式, 直到把所有可能的推导序列都试探完 仍不成功才能确认输入串不是该文法 的句子而报错 。称为带回溯的自顶 向下分析。 -回溯需要推导记住现场,浪费了大量 的时间和空间,必须设法消除。
在推导过程中,可以完全根据向前看符号唯 一决定选择哪个产生式往下推导,因此,分析过 程是完全确定的。这种分析称为确定的自顶向下 分析方法。
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章-语法分析(一)

基本任务:识别符号串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最终被识别为某一语法成分,即
自顶向下分析 自底向上分析
自顶向下分析算法的基本思想为:
若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章-语法分析(一)

北京航空航天大学计算机学院
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
北京航空航天大学计算机学院
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
最左推导
最左推导:推导过程中任何一步推导α⇒β都是对α 中的最左非终结符进行替换。
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