编译原理-第四章A
编译原理第4章答案
第四章词法分析1.构造下列正规式相应的DFA:(1)1(0|1) * 101(2)1(1010* | 1(010) * 1)* 0(3)a((a|b) * |ab * a)* b(4)b((ab)* | bb) * ab解:(1)1(0|1) * 101 对应的 NFA为1101012341下表由子集法将NFA 转换为 DFA:I I0=ε-closure(MoveTo(I,0))I1=ε-closure(MoveTo(I,1))A[0]B[1]B[1]B[1]C[1,2]C[1,2]D[1,3]C[1,2]D[1,3]B[1]E[1,4]E[1,4]B[1]B[1]001101A B C D E110,1(2)1(1010 * | 1(010) * 1)* 0 对应的 NFA 为εε1101010 01234561εε101978ε下表由子集法将NFA 转换为 DFA:I I=ε-closure(MoveTo(I,0))I1= ε-closure(MoveTo(I,1))A[0]B[1,6]B[1,6]C[10]D[2,5,7]C[10]D[2,5,7]E[3,8]B[1,6]E[3,8]F[1,4,6,9] F[1,4,6,9]G[1,2,5,6,9,10]D[2,5,7]G[1,2,5,6,9,10]H[1,3,6,9,10]I[1,2,5,6,7] H[1,3,6,9,10]J[1,6,9,10]K[2,4,5,7] I[1,2,5,6,7]L[3,8,10]I[1,2,5,6,7] J[1,6,9,10]J[1,6,9,10]D[2,5,7]K[2,4,5,7]M[2,3,5,8]B[1,6]L[3,8,10]F[1,4,6,9] M[2,3,5,8]N[3]F[1,4,6,9] N[3]O[4]O[4]P[2,5]P[2,5]N[3]B[1,6]1L111111010B I KA D E F M00110 00C11G H J101NP O(3)a((a|b) * |ab * a)* b(略 )(4)b((ab) * | bb) * ab(略 )2.已知 NFA=( {x,y,z},{0,1},M,{x},{z} )其中:M(x,0)={z},M(y,0)={x,y},M(z,0)={x,z},M(x,1)={x}, M(y,1)=φ ,M(z,1)={y},构造相应的 DFA。
编译原理课件第四章
单词符号
语法分
源程序 词法分
语法分 析树 编译程序
析器 取下一单词 析器
后续部分
... 符号表
• 语法分析的方法: • 自下而上分析法(Bottom-up)
• 基本思想:从输入串开始,逐步进行“归约”,
直到文法的开始符号。即从树末端开始,构造语法 树。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。
FIRST( i)∩FOLLOW(A)= i=1,2,...,n
如果一个文法G满足以上条件,则称该文法G为L L(1)文法。
• 对于一个满足上述条件的文法,可以对其输入串进行有效的无回溯的自上而下分析。假 设要用非终结符A进行匹配,面临的输入符号为a,A的所有产生式为 A→ 1 | 2 | … | n 1. 若aFIRST( i),则指派 i执行匹配任务;
Q→Sab | ab | b • 现在的Q不含直接左递归,把它代入到S的有关候选后,S变成
S→Sabc | abc | bc | c
• 例 考虑文法G(S)
S→Qc|c Q→Rb|b R→Sa|a
• S变成
S→Sabc | abc | bc | c
• 消除S的直接左递归后: S→abcS | bcS | cS S→abcS | Q→Sab |ab | b R→Sa|a
P P
含有左递归的文法将使自上而下的分 析陷入无限循环。
4.3 LL(1)分析法
• 构造不带回溯的自上而下分析算法 • 要消除文法的左递归性 • 克服回溯
4.3.1 左递归的消除
• 直接消除见诸于产生式中的左递归:假定关于非终结符P的规则为 P→P |
其中不以P开头。 我们可以把P的规则等价地改写为如下的非直接左递归形式:
编译原理第4章.doc
第四章作业4.1 对下面文法,设计递归下降分析程序。
S→aAS|(A) , A→Ab|c解:将左递归去掉,将规则A→Ab|c 改成 A→c{b}非终结符号S的分析程序如下:非终结符号A的分析程序如下:4.2 设有文法G[Z]:Z∷=(A) , A∷=a|Bb , B∷=Aab若采用递归下降分析方法,对此文法来说,在分析过程中,能否避免回溯?为什么?解:若采用递归下降分析方法,对此文法来说,在分析过程中,不能避免回朔。
因为A∷=a|Bb和B∷=Aab构成了间接的左递归,不满足实现没有回溯的递归下降分析方法的条件,因此在分析过程中,将造成回溯。
4.3 若有文法如下,设计递归下降分析程序。
<语句>→<语句><赋值语句>|ε<赋值语句>→ID=<表达式><表达式>→<项>|<表达式>+<项>|<表达式>-<项><项>→<因子>|<项>*<因子>|<项>/<因子><因子>→ID|NUM|(<表达式>)解:首先,去掉左递归(1)<语句>→<语句><赋值语句>|ε改为: <语句>→{<赋值语句>}(3)<表达式>→<项> | <表达式> + <项> | <表达式> - <项> 改为:<表达式>→<项>{(+ | -)<项>}(4)<项>→<因子> | <项> * <因子> | <项> / <因子>改为:<项>→<因子>{(* | /)<因子>}则文法变为:<语句>→{<赋值语句>}<赋值语句>→ID=<表达式><表达式>→<项>{(+ | -)<项>}<项>→<因子>{(* | /)<因子>}<因子>→ID|NUM|(<表达式>)非终结符号 <语句>→{<赋值语句>} 的分析程序如下:非终结符号 <赋值语句>→ID=<表达式> 的分析程序如下:非终结符号<表达式>→<项>{(+ | -)<项>} 的分析程序如下:非终结符号 <项>→<因子>{(* | /)<因子>} 的分析程序如下:非终结符号 <因子>→ID|NUM|(<表达式>) 的分析程序如下:4.4 有文法G[A]:A::=aABe|ε,B::=Bb|b(1)求每个非终结符号的FOLLOW集。
编译原理第四章参考答案
编译原理第四章参考答案1.1考虑下⾯⽂法G1S->a|^|(T)T->T,S|S消去G1的左递归。
然后对每个⾮终结符,写出不带回溯的递归⼦程序。
答::(1)消除左递归:S->a|^|(T)T-> ST’T’->,S T’|ε(2)first(S)={ a , ^ , ( } first(T)= { a , ^ , ( } first(T’)={ , ε}First(a)={a},First(^)={^},First( (T) )={ ( }S的所有候选的⾸符集不相交First(,ST’)={,} ,First(ε)={ε},T’的所有候选的⾸符集不相交Follow(T’)=Follow(T)={ )}first(T’)∩Follow(T’)={}所以改造后的⽂法为LL(1)⽂法。
不带回溯的递归⼦程序如下:S( ){if (lookahead=’a’) advance;Else if(lookahead=’^’) advance;Else if(lookahead=’(’){advance;T();if(lookahead=’)’) advance;else error();}Else error();}T( ){S( );T’( ):}T’->,S T’|εT’( ){if (lookahead=’,’){advance;T’();}Else if(lookahead=Follow(T’)) advance;Else error;}有⽂法G(S):S→S+aF|aF|+aFF→*aF|*a(1)改写⽂法为等价⽂法G[S’],消除⽂法的左递归和回溯(2)构造G[S’]相应的FIRST和FOLLOW集合;(3)构造G[S’]的预测分析表,以此说明它是否为LL(1)⽂法。
(4)如果是LL(1)⽂法,请给出句⼦a*a+a*a*a的预测分析过程该⽂法为LL(1)⽂法,因为它的预测分析表中⽆冲突项。
编译原理第4章习题答案
5)所有由0和1组成的且其中不包含子串011的串的集合。
S AB A 1 A | B 0 B | 01 B |
S->aS’ S’->aS’AS’|Ɛ A->+|*
First(S) = First(aS’)={a} First(S’)= First(aS’AS’) ∪ First(Ɛ)= {a} ∪{Ɛ}= {a, Ɛ} First(A) = { +,*}
Follow(S) ={$} 因为 S->aS’,所以把Follow(S)加入到Follow(S’)中。 因为 S’->aS’AS’的第一个S’ ,所以把First(AS’)={+,*}加入到Follow(S’)中。 因为 S’->aS’AS’的第二个S’ ,所以Follow(S)加入到Follow(S’)中。 所以,Follow(S’)= {$, +,*} 对 S’->aS’AS’的A ,当A后面的S’推导出非空时,把First(S’)-{Ɛ}={a}加入到Follow(A)中。 对 S’->aS’AS’的A ,当A后面的S’推导出空时,把Follow(S’)={$,+,*}加入到Follow(A)中。 所以,Follow(A)= {a, +,*,$} 对于S’->aS’AS’|Ɛ,因为First(aS’AS’) ∩Follow(S’)={a} ∩{$,+,*}=空集,所以没有冲突。 对于A->+|*,因为First(+) ∩First(*)={+} ∩{*}=空集,所以没有冲突。 所以该文法是LL(1)文法。
编译原理第4章答案
第四章 词法分析1.构造下列正规式相应的DFA :(1) 1(0|1)*101(2) 1(1010*| 1(010)*1)*0 (3) a((a|b)*|ab *a)*b (4) b((ab)*| bb)*ab 解:(1)1(0|1)*101对应的NFA 为下表由子集法将NFA 转换为DFA :(2)1(1010*| 1(010)*1)*0对应的NFA 为 10,1下表由子集法将NFA转换为DFA:(3)a((a|b)*|ab *a)*b (略) (4)b((ab)*| bb)*ab (略)2.已知NFA=({x,y,z},{0,1},M,{x},{z})其中:M(x,0)={z},M(y,0)={x,y},M(z,0)={x,z},M(x,1)={x}, M(y,1)=φ,M(z,1)={y},构造相应的DFA 。
解:根据题意有NFA 图如下下表由子集法将NFA 转换为DFA :0,1下面将该DFA最小化:(1)首先将它的状态集分成两个子集:P1={A,D,E},P2={B,C,F}(2)区分P2:由于F(F,1)=F(C,1)=E,F(F,0)=F并且F(C,0)=C,所以F,C等价。
由于F(B,0)=F(C,0)=C,F(B,1)=D,F(C,1)=E,而D,E不等价(见下步),从而B与C,F可以区分。
有P21={C,F},P22={B}。
(3)区分P1:由于A,E输入0到终态,而D输入0不到终态,所以D与A,E可以区分,有P11={A,E},P12={D}。
(4)由于F(A,0)=B,F(E,0)=F,而B,F不等价,所以A,E可以区分。
(5)综上所述,DFA可以区分为P={{A},{B},{D},{E},{C,F}}。
所以最小化的DFA如下:3.将图确定化:1101111解:下表由子集法将NFA 转换为DFA :4.把图的(a)和(b)分别确定化和最小化:(a) (b)解: (a):下表由子集法将NFA 转换为DFA :0,1a可得图(a1),由于F(A,b)=F(B,b)=C,并且F(A,a)=F(B,a)=B,所以A,B 等价,可将DFA 最小化,即:删除B ,将原来引向B 的引线引向与其等价的状态A ,有图(a2)。
编译原理第四章答案
编译原理第四章答案1. 介绍编译原理是计算机科学中一门重要的课程,它涵盖了编译器设计与实现的基本知识和技术。
本文将针对编译原理第四章的问题进行详细解答。
第四章主要讨论了词法分析的相关内容,包括正则表达式和有限自动机。
2. 正则表达式正则表达式是一种表示字符串模式的方法。
它由一些字符和操作符组成,用于描述一类字符序列的模式。
正则表达式通常用于文本搜索、匹配和替换操作中。
2.1 正则表达式的基本操作符正则表达式的基本操作符包括字符、连接、选择和重复。
•字符:可以是单个字符,例如a、b、c。
•连接:用于连接两个正则表达式,例如ab表示在字符串中同时出现a和b。
•选择:用于在多个正则表达式中选择一个,例如a|b表示字符串中可以是a或者b。
•重复:用于指定某个正则表达式的重复次数,例如a*表示a可以出现任意次数(包括 0 次)。
2.2 正则表达式的语法正则表达式的语法规则如下:•字符:表示一个字符。
•.:表示任意字符。
•[]:表示字符集合,匹配括号内的任意一个字符。
•[^]:表示字符集合的补集,匹配除了括号内的字符之外的任意字符。
•-:表示范围,例如[a-z]匹配任意小写字母。
•*:表示重复零次或多次。
•+:表示重复一次或多次。
•?:表示重复零次或一次。
•():表示分组。
2.3 正则表达式的应用正则表达式在编译原理中的应用非常广泛。
在词法分析中,正则表达式可以用来描述编程语言中的单词(token)和它们的模式。
编译器可以使用正则表达式作为词法分析器的输入,用于将源代码分解为不同的单词。
3. 有限自动机有限自动机(Finite Automaton,FA)是一种用于描述正则语言的理论模型。
它是一种数学模型,包括有限个状态和状态之间的转移。
根据输入的字符,自动机会从一个状态转移到另一个状态。
3.1 有限自动机的组成有限自动机由以下几个部分组成:•有限个状态:每个状态表示自动机在某个时刻的状态。
•输入符号集合:表示自动机接受的输入字符集合。
编译原理第四章作业答案
非终结符
FIRSTVT
LASTVT
E
+ * ↑( i
+ * ↑) i
T
* ↑( i
* ↑) i
F
↑( i
↑)i
P
(i
)i
2).关系 1.由#E#,知 # = # ;由(E)知 ( = ) 2.求 < 关系 考察对象:文法中终结符号在前,非终结符号在后的相邻符号对 由#E # < FIRSTVT(E) 由+T + < FIRSTVT(T) 由*F * < FIRSTVT(F) 由↑F ↑< FIRSTVT(F) 由(E ( < FIRSTVT(E)
T→F
F→-P
F→P
P→(E)
P→i
(1) 构造 G 的算符优先矩阵;
(2) 指出 G 不是算符优先文法,即指出具有多重定义的优先矩阵元素;
(3)将 G 改写为算符优先文法。
解:
(1)求每个非终结符号的 FIRSTVT 集和 LASTVT 集
S→E
E→E-T|T
T→T*F|F
F→-P|P
P→(E)|i
Z 11 Z 12 Z 13
(S
A
B ) = (φ (S ) + () [S ] + [])Z 21
Z 22
Z
23
Z 31 Z 32 Z 33
Z 11 Z 12 Z 13 ε φ φ A B φ Z 11 Z 12 Z 13
Z 21
Z 22
Z
23
=
φ
ε
φ
+
ε
φ
φ
Z
21
Z 22
编译原理课件第四章
中间代码生成的过程和方法
过程
中间代码生成是将源代码转换为中间表示形式的过 程,可以使用三地址码等中间代码表示。
方法
中间代码生成可以应用常见的优化技术,如常量折 叠、公共子表达式消除等。
编译优化的基本原理和技术
基本原理
编译优化的基本原理包括消除冗余、提高并行度和改进数据局部性等。
技术
编译优化的常用技术有指令调度、循环优化和内函数等。
编译原理课件第四章
在这一章中,我们将介绍编译原理课件中的第四章内容。我们将探讨编译器 前端和后端的概念,以及它们各自的任务和流程。
编译器前端和后端
1
编译器后端
2
编译器后端负责中间代码生成、代码优 化和目标代码生成等任务。
编译器前端
编译器前端负责词法分析、语法分析和 语义分析等任务。
语法分析器的作用和原理
1 作用
语法分析器用于分析源代码的语法结构,并生成抽象语法树。
2 原理
语法分析器使用文法规则和语法分析算法进行解析,如LL(1)分析和LR分析。
语法制导翻译的概念和实现
概念
语法制导翻译是在语法分析的同时进行翻译,通过 语法规则和语义动作实现。
实现
语法制导翻译可以使用语义动作和符号表等技术来 实现语义分析和中间代码生成。
编译原理课件chapter4
三地址代码的生成
总结词
三地址代码是一种常见的中间代码形式,它由一系列的三元 式组成,每个三元式包含一个操作符和两个操作数。
详细描述
三地址代码的生成是编译过程中的一个重要步骤,它通过对 源代码进行语法分析和语义分析,将高级语言转换为一系列 的三元式。这些三元式表示了源代码中的运算和数据传输操 作,可以进一步转换为目标代码。
常见的寄存器分配算法包括基于 图的方法、线性扫描算法和遗传
算法等。
目标代码的生成
01
02
03
04
目标代码的生成通常涉及指令 选择、指令调度和代码优化等
步骤。
指令选择是根据中间代码选择 合适的目标指令的过程,需要 考虑指令集架构、语义等约束
。
指令调度是为了确定指令的执 行顺序,以充分利用处理器资
源并提高指令级并行度。
为了能够处理连续输入的字符流,词 法分析器需要使用一个输入缓冲区来 存储尚未处理的字符。
设计状态转换图
根据正则表达式的规则,可以设计出 一个状态转换图,用于描述如何将输 入的字符转换为相应的词法单元。
词法分析器的实现
编写词法分析器程序
根据状态转换图和输入缓冲区的处理 逻辑,可以编写出相应的词法分析器 程序。
循环展开
将循环体多次执行,减 少循环次数,提高程序
运行效率。
循环优化
通过优化循环结构,减 少循环次数,提高程序
运行效率。
函数内联
将函数调用替换为函数 体中的代码,减少函数
调用的开销。
循环优化
01
02
03
04
循环展开
将循环体多次执行,减少循环 次数,提高程序运行效率。
循环合并
将多个循环合并为一个循环, 减少循环次数,提高程序运行
编译原理 Chapter 4
码生成 支持语言的演化和迭代
3
语法分析器的作用
• 基本作用
– 从词法分析器获得词法单元的序列,确认该序列是否 可以由语言的文法生成
– 对于语法错误的程序,报告错误信息 – 对于语法正确的程序,生成语法分析树 (简称语法树)
• 通常并不真的生产这棵语法分析树
4
语法分析器的分类
• 通用语法分析器
– 可以对任意文法进行语法分析 – 效率很低,不适合用于编表示形式
– 根结点的标号时文法的开始符号 – 每个叶子结点的标号是非终结符号、终结符号或ε – 每个内部结点的标号是非终结符号 – 每个内部结点表示某个产生式的一次应用
• 内部结点的标号为产生式头,结点的子结点从左到右是产生 式的体
• 树的叶子组成的序列是根的文法符号的一个句型 • 一棵语法分析树可对应多个推导序列,但每颗分
18
词法分析和语法分析的比较
阶段
输入
输出
描述体系
词法分析 源程序符号串 词法单元序列 正则表达式
语法分析 词法单元序列 语法树 上下文无关文法
19
上下文无关文法和正则表达式 (1)
• 上下文无关文法比正则表达式的能力更强
– 所有的正则语言都可以使用文法描述 – 但是一些用文法描述的语言不能用正则表达式描述
| other open_stmt if expr then stmt
精品课件-编译原理(第四版)-第4章
我们再举一例说明属性文法。一简单变量类型说明的文法G[D] 如下:
G[D]:D→int L∣float L
L→L, id∣id
其对应的属性文法为
(1)D→TL
L.in=T.type
(2)T→int
T.type=int
(3)T→float
T.type=float
(4)L→L(1),id L(1).in=L.in; addtype ( id.entry, L.in )
(1)赋值语句:左部 表达式
(2)条件语句:表达式 语句1 语句2
与抽象语法相对应的语法树称为抽象语法树或抽象树, 如赋值语句x=a−b*c的抽象语法树如图4-4(a) 所示,而图4-4(b) 则是该赋值语句的普通语法树。
图4–4 x=a−b*c的语法树
(a) 抽象语法树;(b) 普通语法树 图
语义栈 _ __ _7 _7_ _7_ _ _7_9 _7_9_ _7_9_ _ _7_9_5 _7_45 _52
输入串 7+9*5#
+9*5# +9*5#
9*5# *5# *5# 5# # # # #
主要动作 s3 r4 s4 s3 r4 s5 s3 r4 r2 r1 acc
Hale Waihona Puke 4.2 属 性 文 法一个源程序经过词法分析、语法分析之后,表明该源程序 在书写上是正确的,并且符合程序语言所规定的语法。但是语 法分析并未对程序内部的逻辑含义加以分析,因此编译程序接 下来的工作是语义分析,即审查每个语法成分的静态语义。如 果静态语义正确,则生成与该语言成分等效的中间代码,或者 直接生成目标代码。直接生成机器语言或汇编语言形式的目标 代码的优点是编译时间短且无需中间代码到目标代码的翻译, 而中间代码的优点是使编译结构在逻辑上更为简单明确,特别 是使目标代码的优化比较容易实现。
编译原理第4章作业答案
第四章习题4.2.1:考虑上下文无关文法:S-〉SS+|SS*|a 以及串aa+a* (1)给出这个串的一个最左推导 S-> S S *-> S S + S * -> a S + S * -> a a + S * -aa +a(3)给出这个串的一棵语法分析树习题4.3.1:下面是一个只包含符号a 和b 的正则表达式的文法。
它使用+替代表示并运算的符号|,以避免和文法中作为元符号使用的竖线相混淆:rexpr T rexpr+rterm|rtermrterm —rtermrfactor|rfactorrfactor —rfactor*|rprimaryrprimary —a|b1)对这个文法提取公因子2)提取公因子的变换使这个文法适用于自顶向下的语法分析技术吗? 3)提取公因子之后,原文法中消除左递归4)得到的文法适用于自顶向下的语法分析吗? 解1)提取左公因子之后的文法变为rexpr —rexpr+rterm|rtermrterm —rtermrfactor|rfactorrfactor —rfactor*|rprimaryrprimary —a|b 2)不可以,文法中存在左递归,而自顶向下技术不适合左递归文法 3)消除左递归后的文法rexpr->rtermrexpr'rexpr'->+rtermrexpr'l e rterm->rfactorrterm'rterm'->factorrterm'|erfactor->rprimayrfactor'fact or'-〉*rfactor'|erprimary->a|b4) 该文法无左递归,适合于自顶向下的语法分析习题4.4.1:为下面的每一个文法设计一个预测分析器,并给出预测分析表。
可能要先对文法进行提取左公因子或消除左递归 (3)S-〉S(S)S|*(5)S->(L)|aL->L,S|S 解 (3)①消除该文法的左递归后得到文法S-〉S'S'-〉(S)SS'|*②计算FIRST 和FOLLOW 集合FIRST(S)={(,*}FOLLOW(S)={),$} FIRST(S')={(,*}FOLLOW(S')={),$}③构建预测分析表①消除该文法的左递归得到文法S-〉(L)|a L->SL' L'-〉,SL'|£②计算FIRST 与FOLLOW 集合FIRST(S)={(,a}FOLLOW(S)={),,,$}FIRST(L)={(,a}FOLLOW(L)={)} FIRST(L')={,,£}FOLLOW(L')={)}习题4.4.4计算练习4.2.2的文法的FIRST 和FOLLOW 集合3)S T S(S)S|5) S T (L)|a,L T L,S|S 解:3)FIRST(S)={£,(}FOLLOW(S)={(,),$} 5) FIRST(S)={(,a}FOLLOW(S)={),,,$}FIRST (L )={(,a}FOLLOW (L )={),,}习题4.6.2为练习4.2.1中的增广文法构造SLR 项集,计算这些项集的GOTO 函数,给出这个文法的语法分析表。
[电脑基础知识]编译原理 - 陈火旺版 - 第四章_OK
2021/8/18
4
自上而下分析的问题(1)
• 左递归
例:例文法G0[S]:
(1) S→Sa (2) S→b 分析baa是不是文法的句子 按照自上而下的分析思想,选用产生式(1)来推导SSa, 语法树末端结点最左符号为非终结符,所以选用(1)继续 推导SSaSaa 此时语法树末端结点最左符号为非终结符,选用(1) 继续推导SSaSaa Saaa
• 计算FOLLOW集 1.对于文法的开始符号S,置#于FOLLOW(S) 中; 2.若A αBβ是一个产生式,则把 FIRST(β)\{}加至FOLLOW(B)中; 3.若A αB是一个产生式,或AαBβ是一个产生式而β =>* (即FIRST(β)), 则把FOLLOW(A)加至FOLLOW(B)中.
试图用S匹配输入串时,出现:在没有识别任何输入符号的情况下,又 得重新要求S去进行新的匹配,分析过程陷入无限循环
2021/8/18
5
自上而下分析的问题(2)
• 回溯
例:G[S]: S→xAy, A→ab|a
若当前输入串为xay,首先构造的推导SxAy
匹配
进一步推导对A可选择A→ab替换,得SxAy xaby
FIRST(TE’)={(,i}
FIRST(+TE’)={+}
FIRST(FT’)={(,i}
FIRST(*FT’)={*}
FIRST((E))={(}
F
FIRST(i)={i}
i
E
T
E’
T’ + T E’
《编译原理》第4章词法分析
编译原理武汉大学计算机学院编译原理课程组第4章词法分析·词法分析器·单词符号·词法分析程序设计·词法分析器的自动生成4.1 词法分析器与单词符号词法分析程序依据语言词法规则,分析由字符组成的源程序,把它识别为一个一个具有独立意义的最小语法单位,即“单词”,并识别出与其相关的属性(如是标识符,是界限符,还是数,等等),再转换成长度上统一的标准形式——属性字,把字符串形式的源程序改造成为单词符号串(属性字)形式的中间程序,以供其它部分使用。
1. 词法分析程序的作用如删除注解、空格、回车符、换行符之类非必要信息,把标识符登录入符号表及某些预加工处理等。
4.1 词法分析器与单词符号2.词法分析程序的地位·作为一个独立阶段⑴能独立地研究词法与语法两方面的特性。
⑵词法规则简单,可建立特别适用的有效分析技术,易于实现词法分析程序生成自动化。
⑶可以就同一语言,为每种不同的机器编写一个词法分析程序,而只编写一个共同的语法分析程序。
每当语法分析程序需要一个单词符号时就调用词法分析子程序,每一次调用,词法分析子程序就从源程序中识别出一个单词符号交给语法分析程序。
2.词法分析程序的地位4.1 词法分析器与单词符号·作为一个独立阶段·安排为一个子程序4.1 词法分析器与单词符号3. 单词符号程序语言的单词符号一般可分为五种:关键字、标识符、常数、运算符、界限符。
•单词种别一类一码;一符一码。
•单词符号的属性值反映单词符号特征或特性的值。
如标识符的符号表指针,常数的常数表指针等。
4.2 扫描程序的设计1.预处理如删除注解、空格、回车符、换行符之类非必要信息。
从源程序中处理出一串确定长度的输入字符,并将其装进词法分析程序指定的缓冲区——扫描缓冲区中。
4.2 扫描程序的设计1.预处理2.单词符号的识别——超前搜索•关键字的识别•标识符的识别•常数的识别•算符和界限符的识别4.2 扫描程序的设计状态转换图的实现:将状态转换图看作是通常的程序框图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
回溯问题的解决
U xV|xW变换成∶ U xY Y V|W
– 改写后的文法中,非终结符号U的右部只有 一个选择,而引入的新非终结符号Y具有两 个选择V或W,且这两个选择所推出的终结 符号串所组成的头符号集合不相交。
2012-3-21
北京理工大学
回溯问题的解决例
例4.1 设有如下文法 G (1) S → aAb (2) A → de |d 推导出字符串 $ = adb是此文法的句子。 G变为 S→ aAb A→ dB B→ e| ε
产生的原 2012-3-21 因?
失败:由于使用最左推导,对左递归文法进 行自顶向下分析时,会导致死循环。 北京理工大学
…
结论
左递归和回溯问题的产生直接与描述 语言的文法有关 =>要对文法进行确定的自顶向下分析 应该改造文法,使其不含左递归和回 溯
2012-3-21
北京理工大学
回溯问题的原因
回溯产生的真正原因是:某非终结符对应多个 侯选式,它们右部的第一个终结符相同,从而 导致语法分析器选择了错误的侯选式。 如果希望没有回溯,对文法有什么要求?
例:
设产生式为: A→δα1|δα2|…|δαn 将其替换为: AδA’
2012-3-21
A’ α1|α2|…|αn 北京理工大学
回溯问题的解决
设文法G是不具有左递归性的文法,U为文 法G的任意非终结符号,即U∈Vn,并假定U 有如下规则∶
– U α1| α2|…| αn
2012-3-21
2012-3-21 北京理工大学
文法G3[S]: S→aA S→d|de A→bAS A→ε
W=abd试图推导的过程: S aA abAS abS abd
2012-3-21
北京理工大学
FOLLOW( A ) = { a | S ==*> …Aa…,a∈VT } A 的后续符号
S
… A a ...
北京理工大学
回溯问题的解决
U α1| α2|…| αn
– 该规则右部具有n个选择。从每一个选择出发, 都可以推导出一个以上的终结符号串。保证当 用非终结符号U去匹配输入串时,能够根据当时 读入的符号准确地选用它的一个选择执行任务。 – 对文法的要求是∶其中的任意一个非终结符 号,当规则右部有多个选择时,由各个选择所 推出的终结符号串的首符号集合要两两不相交。
2012-3-21 北京理工大学
定义:设 G = (VT ,VN , S , P) 是上下文无关文法, A∈VN , S是开始符号。 * FOLLOW(A) = {a|S A且a∈FRIST(), ∈VT*,∈VN+ } * ε,则规定 $∈FOLLOW(A) 若S * A , 且 …Aa… ,a∈VT} 即:FOLLOW(A)={a|S * 若S * …A,则规定 $∈FOLLOW(A) $作为输入串的结束符,或称为句子括号,如: $ 输入串 $ 2012-3-21 北京理工大学
北京理工大学
a
…
左递归问题
直接左递归
– 自顶向下分析方法不能处理具有左递 归性的文法的原因:
• 文法的直接左递归表现在其含有A→A ( ∈(VT∪VN)*) 形式的产生式规则,为 了实现用A…匹配输入串,又会遇到要用 A去匹配。故又要启用上述规则的右部符 号串A…来完成匹配工作。如此循环下去 而无法终止。
2012-3-21
FIRST(Ap)={a,c} FIRST(Bq)={b,d}
北京理工大学
回溯问题的解决理由
消除回溯的理由:
– 带回溯的自顶向下的分析方法实际上采用了一 种穷尽一切可能的选择试探法。因此,效率 低,代价高。要构造一个行之有效的自顶向下 的语法分析程序,就必须消除回溯。
2012-3-21
– 优先关系法 – LR分析方法
2012-3-21
北京理工大学
自顶向下分析
从文法开始符出发试图推导出所给的终 极符串。
– 例 G[z] : [1] Z aBd [3] B c [2] B d [4] B bB
对给定的终极符串abcd,推导过程: Z [1] aBd [4] abBd [3] abcd
自顶向下分析面临的问题
问题1:回溯
a •例1:设有文法 (1) S -> aAb (2) A -> de|d 现有输入串:adb 其分析过程如下: d S A e b
输入符号串: adb
失败,需要退回,重新选取A的侯选式
产生的原 2012-3-21 因?
这时使得分析器的动作不稳定
北京理工大学
问题2:左递归
编译原理
第四章 语法分析 北京理工大学:商建云
Email: Shangjia@
(1)
2012-3-21
北京理工大学
本讲主要内容
语法分析程序的功能 语法分析方法
– 自顶向下分析方法
• 递归下降分析法 • 预测分析法
– 自底向上分析方法(下讲内容)
2012-3-21
北京理工大学
语法分析(Syntax analysis)
2012-3-21 北京理工大学
回溯问题的解决
当文法不满足避免回溯的条件时,可以 改写文法,即对规则右部反复提取左因 子。 例题∶ 规则:U xV|xW, (1)改写为∶U x(V|W) (2)引入一个新的非终结符号Y,则规 则变换成∶ U xY Y V|W
2012-3-21 北京理工大学
特点:
– 是自顶向下分析的一般方法,分析过程的本质 是一种试探过程。
2012-3-21 北京理工大学
由于对输入串是自左向右扫描的,因此 用最左推导,只有用最左推导,才能保 证按扫描顺序去匹配输入串。
2012-3-21
北京理工大学
自顶向下分析
W=pccadd自顶向下的推导过程:
文法G1[S]: S pA pcAd pccAdd pccadd S→pA 语法树: S→qB S S S S A→cAd p A p A p A p A A→a B→dB c A d c A d c A d B→b
自上而下分析法的核心是不断寻找可匹配串对
2012-3-21 北京理工大学 句型中最左的非终结符进行推导的过程;
Z [1] aBd [4] abBd [3] abcd
Z a b B B c d 下
S
上
$∈L(பைடு நூலகம்)
2012-3-21 北京理工大学
$
自顶向下分析
思路:
– 对任一输入符号串,通过一切可能的办法,从 树根结点(识别符号)出发,根据文法自上而下地 为输入串建立一棵语法树;或者说,从识别符 号开始,根据文法试图为输入串建立一个推导 序列。
北京理工大学
文法G2[S]: S→Ap S→Bq S A→a A A→cA B→b B→dB
2012-3-21
W=ccap自顶向下的推导过程: S Ap cAp ccAp ccap 语法树: S p c A A p c c A A A S p c c A A A a
北京理工大学
S p
左递归:是左递归的,如果一个文法中存在 A 。 某个非终结符号A,使A 如果是A A,则称为直接左递归,否则 称为间接左递归。 E 例2:设有文法: E + T (1) E->E+T|T E + T (2) T->T*F|F E + T (3) F->(E)|i 现有输入串i*i+i, 其分析过程是:
2012-3-21
北京理工大学
定义:设 G = (VT ,VN , S , P) 是上下文无关文 * 法, * α) = {a|α aβ,a∈ V ,α,β ∈ V *} FIRST( T N 若α ε,则规定ε∈FIRST(α)
α a …
2012-3-21
…
北京理工大学
• 文法G2[S]: S→Ap S→Bq A→ a A→cA B→ b B→dB
2012-3-21 北京理工大学
直接左递归的消除
假定关于非终结符P的规则为:
P→Pα|β
α、β∈(VT∪VN)*
2012-3-21
北京理工大学
例
例4.6(P56)
2012-3-21
北京理工大学
左递归问题
例:设有文法 G和输入 字符串 $ G: A →Aa|a $: aaa
A A A
2012-3-21
L(G)=aa*
按照自上而下分析法对 输入串$产生分析树,则对非 a 终结符的最左推导会使分析 树无休止的延伸,使自上而 下分析陷入死循环。
c A d c A d a
2012-3-21 北京理工大学
• 文法G1[S]: S→pA S→qB A→cAd A→ a B→dB B→ b
2012-3-21
这个文法的特点: 1. 每个产生式的右部都由 终结符号开始。 终结符号 2. 如果两个产生式 有相同 如果 的左部,那么它们的 右 的左部 部由不同的终结符开始。 终结符开始
• 文法G1[S]: S→Ap S→Bq A→ a A→cA B→ b B→dB
2012-3-21
这个文法的特点: 1. 每个产生式的右部不全是 由终结符号开始。 终结符号 2. 如果两个产生式有相同的 左部,那么它们的右部由 不同的终结符或非终结符 不同的 开始。 3. 文法中无空产生式。
北京理工大学
Returm
A→α A→β 其中A∈VN , α, β ∈VN* 当α和β不同时推导出空时(设 α不推导 出空,β推导出空),则当 FIRST(α)∩(FIRST(β)∪FOLLOW(A))=Φ时, 对于非终结符A的替换仍可唯一地确定候选。
2012-3-21 北京理工大学