编译原理第3章 语法分析

合集下载

北航编译原理课件 03.词法分析

北航编译原理课件 03.词法分析

3. 词法分析程序算法
北京航空航天大学计算机学院
17
1.单词及内部表示 单词及内部表示: 单词及内部表示
单词名称
BEGIN END FOR DO IF THEN ELSE 标识符 常数(整 常数 整) : + * , ( ) :=
保留字和分界符采用一符一类
记忆符
BEGINSY ENDSY FORSY DOSY IFSY THENSY ELSESY IDSY INTSY COLONSY PLUSSY STARSY COMSY LPARSY RPARSY ASSIGNSY
字母、数字
标识符 无符号整数
单字符分界符
S S S
字母
标 数字
非字母数字
出口
数字

非数字
出口
+ * , 单界 ( ) :
其他字符 非=
出口
双字符分界符
北京航空航天大学计算机学院
S
冒号
=
双界
其他字符
出口 15
查保留字表 读字符
字母、数字
S
字母
标 数字
非字母数字
标识符
非数字
数字

无符号整数 单字符分界符
如:b{ab} = {ba}b {a|b} = {{a} {b}} = (a*b*)*
北京航空航天大学计算机学院 23
例:设 ∑ = { a,b },下面是定义在∑上的正则表达式和正则集合 正则表达式 ba* a(a|b)* (a|b)*(aa|bb)(a|b)* 正则集合
北京航空航天大学计算机学院
北京航空航天大学计算机学院 20
‘*’ : ‘,’ : ‘(’ : ‘)’ : ‘:’ :

第3章 语法分析-编译原理及实践教程(第3版)-黄贤英-清华大学出版社

第3章 语法分析-编译原理及实践教程(第3版)-黄贤英-清华大学出版社
• 文法是被用来精确而无歧义地描述语言的句子的构成方式. • 文法描述语言的时候不考虑语言的含义。
3.2.1 文法的定义
例1:有如下规则
<句子><主语><谓语> <主语><代词>|<名词> <代词>我 <名词>大学生 <谓语><动词><直接宾语> <动词>是 <直接宾语><代词>|<名词>
(表示由…组成)
• 归约:推导的逆过程。
• 直接归约:直接推导的逆过程
几个概念的形式定义
• 直接推导: 如果αβ是文法 G=(Vn,Vt,P,S)
的产生式,γ和δ是V*中的任意符号,若有符号 串v,w满足: v=γαδ,w=γβδ,则说v直接产生w,(w是v的 直接推导)记作:v=>w 例:S01, 0S0=>0010(直接推导γ=0,δ=0) • 如果存在v=>w0=>w1=>w2...=>Wn=w(n>0),则 称v推导出w(长度为n),记作v+=>w(至少一步) • 若有v=>w或v=w,则记作v*=>w(0步或若干步)
一个非终结符号,β∈V*)
–上例中: G=(Vn,Vt,P,<句子>)
Vn=(<句子>,<主语>,<谓语>,<代词>,<动词>,
<名词>,<直接宾语>)
Vt= (我,是,大学生)
P=
<句子><主语><谓语>
<主语> <代词>|<名词>

编译原理答案(前三章)

编译原理答案(前三章)

编译原理答案(前三章)第 1 章引论第 1 题解释下列术语:答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。

(2)源程序:源语言编写的程序称为源程序。

(3)目标程序:目标语言书写的程序称为目标程序。

(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。

通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。

(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。

(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第 2 题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。

答案:一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。

其各部分的主要功能简述如下。

词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。

语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。

语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。

中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。

中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。

目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。

表格管理程序:负责建立、填写和查找等一系列表格工作。

表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。

编译原理教程-课后习题答案第三章语法分析

编译原理教程-课后习题答案第三章语法分析

由 A′→ABl 得 FIRST(′l′) FOLLOW(B) , 即 FOLLOW(B)={l};
由 A→aA′ 得 FOLLOW(A) FOLLOW(A′) , 即 FOLLOW(A′)={#,d};
第三章 语法分析
由 B→dB′ 得 FOLLOW(B) FOLLOW(B′) , 即 FOLLOW(B′)={l}。
第三章 语法分析
求得:
FIRST(A)={a}
FIRST(A′)={a, ε }
FIRST(B)={d}
FIRST(B′)={b, ε }
对文法开始符号A,有FOLLOW(A)={#}。
由 A′→ABl 得 FIRST(B)\{ ε }FOLLOW(A) , 即 FOLLOW(A)={#,d};
第三章 语法分析
3.9 考虑文法G[S]: S→(T) | a+S | a T→T,S | S
消除文法的左递归及提取公共左因子,然后对每 个非终结符写出不带回溯的递归子程序。
【解答】 消除文法G[S]的左递归: S→(T) | a+S | a T→ST′ T′→,ST′| ε
第三章 语法分析 提取公共左因子:
短语和最左素短语。 【解答】 (1) 句型(S, (a))的语法树如图3-5所示。
第三章 语法分析
S (L ) L ,S S (L )
S a
图3-5 句型(S,(a))的语法树
第三章 语法分析
(2) 由图3-5可知: 短语:S、a、(a)、S,(a)、(S,(a)); 直接短语:a、S; 句柄:S; 素短语:素短语可由图3-5中相邻终结符之间的优 先关系求得,即:
由图3-3可直接得到正规文法G[S]如下: G[S]:S→aA|bB A→aS|bC|b B→bS|aC|a C→bA|aB|ε

编译原理第三版课后习题答案

编译原理第三版课后习题答案

编译原理第三版课后习题答案编译原理是计算机科学中的一门重要课程,它研究的是如何将高级程序语言转换为机器语言的过程。

而《编译原理》第三版是目前被广泛采用的教材之一。

在学习过程中,课后习题是巩固知识、提高能力的重要环节。

本文将为读者提供《编译原理》第三版课后习题的答案,希望能够帮助读者更好地理解和掌握这门课程。

第一章:引论习题1.1:编译器和解释器有什么区别?答案:编译器将整个源程序转换为目标代码,然后一次性执行目标代码;而解释器则逐行解释源程序,并即时执行。

习题1.2:编译器的主要任务是什么?答案:编译器的主要任务是将高级程序语言转换为目标代码,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。

第二章:词法分析习题2.1:什么是词法分析?答案:词法分析是将源程序中的字符序列划分为有意义的词素(token)序列的过程。

习题2.2:请给出识别下列词素的正则表达式:(1)整数:[0-9]+(2)浮点数:[0-9]+\.[0-9]+(3)标识符:[a-zA-Z_][a-zA-Z_0-9]*第三章:语法分析习题3.1:什么是语法分析?答案:语法分析是将词法分析得到的词素序列转换为语法树的过程。

习题3.2:请给出下列文法的FIRST集和FOLLOW集:S -> aAbA -> cA | ε答案:FIRST(S) = {a}FIRST(A) = {c, ε}FOLLOW(S) = {$}FOLLOW(A) = {b}第四章:语义分析习题4.1:什么是语义分析?答案:语义分析是对源程序进行静态和动态语义检查的过程。

习题4.2:请给出下列文法的语义动作:S -> if E then S1 else S2答案:1. 计算E的值2. 如果E的值为真,则执行S1;否则执行S2。

第五章:中间代码生成习题5.1:什么是中间代码?答案:中间代码是一种介于源代码和目标代码之间的表示形式,它将源代码转换为一种更容易进行优化和转换的形式。

编译原理第三章语法分析

编译原理第三章语法分析

3.2 语言和文法
• 文法的优点
–文法给出了精确的,易于理解的语法说明 –自动产生高效的分析器
–可以给语言定义出层次结构
3.2 语言和文法
• 文法的优点
–文法给出了精确的,易于理解的语法说明 –自动产生高效的分析器
–可以给语言定义出层次结构
–以文法为基础的语言实现便于语言的修改
3.2 语言和文法
F id | (E)
3.2 语言和文法
E E+T|T TT* F|F F id | (E)
E T T T * F id F id
E E
T F
+
T F
T * F
id
*
F
id
id id * id * id 和 id + id * id 的分析树
id
3.2 语言和文法
3.2.5 消除二义性 stmt if expr then stmt | if expr then stmt else stmt | other • 句型:if expr then if expr then stmt else stmt
3.2 语言和文法
3.2.5 消除二义性 stmt if expr then stmt | if expr then stmt else stmt | other • 句型:if expr then if expr then stmt else stmt • 两个最左推导: stmt if expr then stmt if expr then if expr then stmt else stmt stmt if expr then stmt else stmt if expr then if expr then stmt else stmt

916073-编译原理原理与技术-第3章 语法分析

916073-编译原理原理与技术-第3章 语法分析

id
id
E E+E E E +E id E + E id id + E id id + id E
E +E
E
*
E id
id
id
3.2 语言和文法
• 文法的优点
–文法为语言给出了精确的、易于理解的语法规范 –自动产生高效的分析器 –可以给语言定义出层次结构 –以文法为基础的语言的实现便于语言的修改
FIRST(E) = FIRST(T) = FIRST(F) = { ( , id } FIRST(E ) = {+, } FRIST(T ) = {, } FOLLOW(E) = FOLLOW(E ) = { ), $} FOLLOW(T) = FOLLOW (T ) = {+, ), $} FOLLOW(F) = {+, , ), $}
id
+ term
term * factor
factor
id
id id + id id 分析树
3.2 语言和文法
3.2.5 消除二义性 stmt if expr then stmt
| if expr then stmt else stmt | other • 句型:if expr then if expr then stmt else stmt • 两个最左推导: stmt if expr then stmt if expr then if expr then stmt else stmt stmt if expr then stmt else stmt if expr then if expr then stmt else stmt
3.3 自上而下分析

编译原理语法分析3(1)

编译原理语法分析3(1)
3.1 上下文无关文法
3.1.1 上下文无关文法的定义 正规式能定义一些简单的语言,能表示给定结构的固定次数的重复或者没有指定次数的重复 例:a (ba)5, a (ba)* 正规式不能用于描述配对或嵌套的结构 例1:配对括号串的集合 例2:{wcw | w是a和b的串}
3.1 上下文无关文法
3.2 语言和文法
expr expr + term | term term term factor | factor factor id | (expr)
expr
id
term
factor
id
id
term
*
term
factor
factor
*
expr
expr
+
id
factor
term
id
3.2 语言和文法
3.2.9 形式语言鸟瞰 文法 G = (VT , VN, S, P) 0型文法: , , (VN VT)*, | | 1 1型文法:| | | |,但S 可以例外 短语文法
3.2 语言和文法
3.2.9 形式语言鸟瞰 文法 G = (VT , VN, S, P) 0型文法: , , (VN VT)*, | | 1 1型文法:| | | |,但S 可以例外 短语文法、上下文有关文法
1
2
开始
a
0
a
b
b
3.2 语言和文法
3.2.2 分离词法分析器理由 为什么要用正规式定义词法 词法规则非常简单,不必用上下文无关文法 对于词法记号,正规式描述简洁且易于理解 从正规式构造出的词法分析器效率高
3.2 语言和文法
从软件工程角度看,词法分析和语法分析的分离有如下好处 简化设计 编译器的效率会改进 编译器的可移植性加强 便于编译器前端的模块划分
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3.1
分析器的作用
3
一、语法分析的任务
把单词符号作为基本单位,根据文法,分析源程 序 (字符串)是否为合法的程序.
同时报告语法错误并进行错误的恢复,使后面的 分析能够进行下去。
源程序 词法 分析器
记号 分析器
取下一个
分析树
记号
前端的 其余部分
中间表示
符号表 分析器在编译器模型中的位置
二、语法错误的处理
4
程序的错误有各种不同的性质。例如,错误可能是: (1)詞法错误,如标识符、关键字或算符的拼写错误 (2)语法错误,如算术表达式的括号不配对 (3)语义错误,如算符作用于不相容的运算对象 (4)逻辑错误,如无穷的递归调用。 大多数错误的诊断和恢复集中在语法分析阶段,原因如下: ➢ (1)大多数错误是语法错误 ➢ (2)诊断语法错误比诊断语义错误和逻辑错误容易得多。 分析器出错处理的基本目标是: (1)清楚而准确地报告错误的出现; (2)迅速从每个错误中恢复过来,以便诊断后面的错误 (3)不应使正确程序的处理速度降低太多。
即: α ,β ∈(VT ∪ VN) * . c) 一个文法,可以仅用开始符号及产生式代替。
例如:表达式的文法可以定义如下:
E →E+E|E-E|E*E|E/E|(E)
E 为文法的开始符号, + - * / ( ) 为终结符。 9
例如:考虑一个文法G1:
S→ bA A→ β |a β →aA 它定义了一个什么样的语言呢? S是开始符号,是非终结符 A是非终结符 β是终结符与非终结符组成的字符串 b是终结符 a是终结符 结论:S→ baa*
stmt→if expr then stmt else stmt
一、 上下文无关文法定义
7
上下文无关文法 G [S]是一个四元组:
G[S] =(VT,VN,S,P) VT : 是一个非空有限集,每个元素称为终结符。
程序设计语言的文法中记号是终结符的同义词。
例如:if,then,else,while,do,等都是终结符。
返回
二、 文法的几点约定
a) 若 A→ α1 A→ α2
则简写为: A→ α1|α2|...... |αk
A→ αk b) 用英文大写字母表前面的字母、字母S、小写字母串 代表非终结符;
英文小写字母表前面的字母、数字、运算符号、标 点符号、黑体字代表终结符;
希腊字母 α β、大写字母后面的字母、小写字目表后 面的字母串等代表由VT,VN组成的符号串;
10
三、 文法 G 与语言L(G)的关系及术语
11
从文法初始符开始,反复用产生式右部替换左部的非终结符,
直到推出的符号串全部由终结符组成.得到G所定义的各种句子.
例如:E=>E+E=>E*E +E=>i * E + E=> i * i + E => i * i + i
定义: 若αBβ,经产生式 B→λ替换后得到 αλβ,称αBβ直接
推出αλβ。{α,λ,β ∈(VT ∪ VN) *},用=>表示直接推出。 若存在α1=> α2 => α3........=> αn ,称α1可推出αn;
+ α1=>
αn表示经一步或若干步α1可推出αn.
自然语言不是上下文无关文法; 程序语言是上下文无关文法. 程序设计语言的许多结构包含固有的递归性,可用上下文无 关文法定义。 例:如果S1和S2是语句,E是表达式,则
“if E then S1 else S2”是语句。 使用语法变量stmt表示语句类,用expr表示表达式类,上述语 句可用文法产生式方便地表示为:
第三章 语法分析
主讲教师: 杨华莉
语法分析概述
2
语法分析方法
自下而上分析法 自上而下分析法
自下而上是指: 根据文法,对输入字串进行归约,若能正确地归约 为文法的初始符号,则表示输入字串是合法的. 典型方法是算符优先分析法。
自上而下是指: 从文法的初始符号进行推导,若能推导出与输入 字串相同的句子,则表示输入字串是合法的. 典型方法是递归下降分析法。
6
文法:是描述语言的语法结构的形式规则(即语法规则) 形式描述:用一组数学符号和规则来描述语言的方式。 形式语言:形式描述所用的数学符号和规则。 形式:指仅考虑数学符号间的推演,而不涉及符号的具体含义。
上下文无关文法是这样一种文法: 它定义的语法单位,独立于 该语法单位可能出现的环境,不必考虑上下文关系.
VN:是一个非空有限集,每个元素为非终结符,代表了一 种语法单位. 且 VT ∩ VN=φ.
例如:程序,表达式,短语,符号,S ∈ VN。 S 是文法 G 的最高层次的语法单位.
在程序语言中, S代表了程序这一语法概念。
P: 是产生式的有限集合。一条产生式定义了一个非终结
三、错误恢复策略
5
(1)紧急方式恢复:发现错误时,分析器每次抛弃一个输入记号, 直至输入记号属于某个指定的同步记号集合为止。 同步记号一般是定界符,如分号或end。 优点:方法简单,不会陷入死循环。 适用于一个语句中很少出现多个错误的情况。
(2)短语级恢复:发现错误时,分析器对剩余输入作局部纠正, 用可以使分析器继续分析的输入串来代替剩余输入的前缀。 如:用分号代替逗号、删除多余的分号、插入遗漏的分号。 这种替换可用于纠正任何输入串,已经用于几个错误修复编
符,产生式形式如下:
A→ α
称A定义为α。
(A∈ VN , α∈ (VT ∪ VN ) * ). (‘→’读为“定义为”, 有时也会用::=代替)
8
例1:文法({id,+,-,*,/,↑,(,)},{expr, op},expr,P)定义了简单的算术表达式,P是由下 列产生式组成的有限集合: expr→expr op expr expr→(expr) expr→-expr expr→id op→+ op→op→* op→/ op→↑
译器,首先是用于自上而下的分析方法。它的主要缺点是很 难应付实际错误出现在诊断点以前的情况。 (3)出错产生式:如果对经常遇到的错误了解得很清楚 ,就可以 扩充语言的文法,增加产生错误结构的产生式,用此扩充的 方法来构造分析器。 (4)全局纠正: 在处理不正确的输入串时,作尽可能少的修改。
3.2 上下文无关文法
相关文档
最新文档