第3章 词法分析 (编译原理 陈火旺)
编译原理陈火旺版PPT课件
Action/Goto
Goto
a
b
,
#
L
E
S0
S/3
S/4
1
2
S1
acc
S2
S/5
r2
S3
r3
r3
S4
r4
r4
S5
S/3
S/4
6
2
S6
r1
4
(1)在总控程序的控制下,从左到右扫描输入串根 据分析栈和输入符号的情况,查分析表确定分析 动作; (2) 分析表是LR分析器的核心,根据文法构造,它 包括动作表(Action)和状态转换表(Goto)两部分, 总控程序根据分析表确定分析动作;
输入符号
状态
X1 X2 … Xp
S0
S3
S1
S2
:
:
S5
Sm
8
二、LR分析过程:
1. 将初始状态S0和输入串的左边界(#) 分别进栈; 2. 根据栈顶状态Si和当前输入符号a查动作表进行如下 工作:
•移进:若Action[Si, a]为“移进”,则a进符号栈; 并查Goto[Si, a]得到新的状态Sj进状态栈; 继续扫描, 即下一个输入符号变成当前输入符号;
(3) 分析栈包括文法符号栈X[i]和相应的状态栈S[i] 两部分,LR分析器通过判断栈顶元素和当前输入 符号查分析表确定下步分析动作。
5
规范归约的关键是寻找句柄,LR法是根据已“移 进” 、“归约”的符号串及即将读入的符号串 进行分析,以确定是否有句柄可归约。
状态:是对迄今为止的整个分析过程的记录以及对
r式1数~(1r字)4~表表(示a4示)文,新即法b状应Ac的t态采ion产的,用生编号# , L Goto E
编译课后答案-陈火旺等编著第三版ppt课件
正规式 (0|1)*010(0|1)*
DFA:
4
1
0
01
00 11 20 3
01 1
1
05
最小化DFA:
1
0
0 011
20
3
2021/8/9
1
最新课件
0,1
11 11
CH.3.练习题10(P64.)
10. 用FA写出渡河的方法。
设:人---R;狼---L;羊---Y;菜---C;
左岸---Z;右岸---U;
依照字典序排列; 正规式 (a|A)*(b|B)*(c|C)*(d|D)*…(z|Z)*
2021/8/9
最新课件
99
CH.3.练习题9(P64.)
9.问题:没构造出DFA;没过程;方法没掌握。
(1) {0,1}上的含有子串010的所有串; 至少含一个。 正规式 (0|1)*010(0|1)* 或 (0*1*)*010(0*1*)*
问题:没写全;表达不准确
解:< int,->,
< CInt, “CInt”> ,
< ::,-> ,
< nMulDiv, “nMulDiv”> ,
<(,->,
< int,-> ,
< n1, “n1”> , < , , -> ,
< int,-> ,
< n2, “n2”> ,
< ),-> ,
< {, -> ,
最小化DFA:
a
0b
a
a
2 b3
b
初始: {0,1}, {2,3,4,5}
编译原理课件-词法分析
號等記號的文法
—— 正規文法
語法:借助於記號來描述語言的結構的文法
—— 上下文無關文法
21/76
二、記號的文法
識別字 常數
–整數 –無符號數
運算符 分界符 關鍵字
22/76
Wensheng Li BUPT @ 2008
識別字
識別字定義為“由字母打頭的、由字母或數字組成
的符號串”
正規運算式?
描述識別字集合的正規運算式:
9/76
Wensheng Li BUPT @ 2008
3.2 詞法分析程式的輸入與輸出
一、詞法分析程序的實現方法 二、設置緩衝區的必要性 三、配對緩衝區 四、詞法分析程序的輸出
10/76
Wensheng Li BUPT @ 2008
一、詞法分析程式的實現方法
利用詞法分析程序自動生成器
–從基於正規運算式的規範說明自動生成詞法分析程序。 –生成器提供用於根源程式字元流讀入和緩沖的若干副程
記號的屬性
詞法分析程式在識別出一個記號後,要把與之有關 的資訊作為它的屬性保留下來。 記號影響語法分析的決策,屬性影響記號的翻譯。 在詞法分析階段,對記號只能確定一種屬性
–識別字:單詞在符號表中入口的指針 –常數:它所表示的值 –關鍵字:(一符一種、或一類一種) –運算符:(一符一種、或一類一種) –分界符:(一符一種、或一類一種)
4/76
Wensheng Li BUPT @ 2008
3.1 詞法分析程式與語法分析程式的關係
詞法分析程式與語法分析程式之間的三種關係
–詞法分析程式作為獨立的一遍 –詞法分析程序作為語法分析程序的副程式 –詞法分析程序與語法分析程序作為協同程式
分離詞法分析程序的好處
编译原理作业集-第三章-修订版
第三章词法分析本章要点1•词法分析器设计,2.正规表达式与有限自动机,3•词法分析器自动生成。
本章目标:1•理解对词法分析器的任务,掌握词法分析器的设计;2.掌握正规表达式与有限自动机;3•掌握词法分析器的自动产生。
本章重点:1. 词法分析器的作用和接口,用高级语言编写词法分析器等内容,它们与词法分析器的实现有关。
应重点掌握词法分析器的任务与设计,状态转换图等内容。
2 •掌握下面涉及的一些概念,它们之间转换的技巧、方法或算法。
(1)非形式描述的语言正规式(2)正规式NFA (非确定的有限自动机)(3)NFADFA (确定的有限自动机)(4)DFA最简DFA本章难点(1)非形式描述的语言正规式(2)正规式NFA (非确定的有限自动机)(3)NFADFA (确定的有限自动机)(4)DFA最简DFA作业题、单项选择题(按照组卷方案,至少15道) 1•程序语言下面的单词符号中,一般不需要超前搜索a.关键字b.标识符c.常数d.算符和界符2. 在状态转换图的实现中,一般对应一个循环语句a.不含回路的分叉结点b.含回路的状态结点c.终态结点d.都不是3. 用了表示字母,d表示数字,={1,d},则定义标识符的正则表达式可以是:。
(a)ld* (b)ll* (c)l(l | d) * (d)ll* | d*4. 正规表达式(e |ajb表示的集合是(a){ , ab, ba, aa, bb} (b){ab , ba, aa, bb}(c){a , b, ab, aa, ba, bb} (d){,込b, aa, bb, ab, ba}5. 有限状态自动机可用五元组( V T , Q , & q o , Q f)来描述,设有一有限状态自动机M的定义如下:V T={0 , 1}, Q={q 0 , q1 , q2}, Q f={q 2}, 3 的定义为:氷 q o , 0) =q1 3 (q1, 0) =q23(q2 , 1) =q2 3 (q2 , 0) =q2M所对应的状态转换图为。
编译原理词法分析
编译原理词法分析编译原理是计算机科学中的一个重要领域,它研究的是如何将高级语言编写的程序转换成目标机器能够执行的指令序列。
而词法分析则是编译原理中的一个重要环节,它负责将源程序中的字符流转换成有意义的词素序列,也就是词法单元。
在这篇文档中,我们将重点讨论编译原理中的词法分析,包括其基本概念、主要任务和实现方法。
词法分析的基本概念是将源程序中的字符流转换成有意义的词素序列,也就是词法单元。
词法单元是编程语言中的基本构造块,它可以是关键字、标识符、常量、运算符等。
词法分析器的主要任务就是识别源程序中的词法单元,并将其转换成相应的记号,以便后续的语法分析和语义分析。
词法分析的实现方法主要有两种,手工编写词法分析器和使用词法分析器生成器。
手工编写词法分析器需要程序员自己定义词法单元的模式,并编写相应的识别程序。
而使用词法分析器生成器则是通过定义词法单元的模式和对应的动作,然后由生成器自动生成词法分析器的识别程序。
两种方法各有优缺点,选择哪种方法取决于具体的需求和实际情况。
在词法分析中,最常用的方法是有限自动机。
有限自动机是一种抽象的数学模型,它可以用来描述词法单元的识别过程。
有限自动机可以分为确定性有限自动机(DFA)和非确定性有限自动机(NFA),它们分别对应着不同的识别算法。
在实际应用中,通常会先构造NFA,然后将其转换成DFA,以便更高效地进行词法分析。
除了有限自动机,正则表达式也是词法分析中的重要工具。
正则表达式是一种描述字符串模式的形式语言,它可以用来描述词法单元的模式。
在词法分析中,通常会使用正则表达式来定义词法单元的模式,然后通过正则表达式引擎来进行匹配和识别。
总的来说,词法分析是编译原理中的一个重要环节,它负责将源程序中的字符流转换成有意义的词素序列。
词法分析的实现方法有手工编写词法分析器和使用词法分析器生成器两种,而在实际应用中,有限自动机和正则表达式是词法分析中的重要工具。
通过本文的介绍,相信读者对编译原理中的词法分析有了更深入的了解。
编译原理 第三章 词法分析
单词符号的表示形式:词法分析器所输出的单词符号常常表示成
二元式(单词种别,单词自身的值)。 单词种别可以用以下形式表示: 1、一类单词统一用一个整数值代表其属性。例如:1代表关键字, 2代表标识符等。 2、每一个单词一个类别。例如:1代表BEGIN,2代表END等。 单词自身的值可以表示成:常量的二进制表示;常量、变量等在符号表 种的地址码,等等。
例3-3:简单的状态转换图示例:
1
X
2
初态
终态
Y
(a)转换图示例 数字
3
从0状态到1状态 可能出现字母
字母或数字 字母 其他
0
1
2
*
0
数字
1
其他
2 *
(b)识别标识符的转换图
(c)识别整数的转换图
例3-4:识别FORTRAN实型常数的转换图:
例如下列实型常数可 以被以下转换图识别: 1.23E+4
•scanner当作一遍。 •把scanner当作子程序。
scanner
源程序
scanner作为一遍
设计前提:
输入
列表 把scanner作为一个独立的子程序; 输入缓冲区 预处理 • 词法分析器的任务为输出单词符号。 子程序
•
扫描缓冲区
预 处 理 部 分
•必要性:编辑性字符如空白符、回车符等,除了出现在文字和 扫描器 常数中以外,在别处出现都没有意义。 扫 单词符号 描 •功 能: 剔除无用字符。 器 语法分析器 •实 现: 预处理子程序。 图2.1 词法分析器
例3-2 :下述C++代码段:while ( i >= j ) i - -; 经词法分析器处理以后,它将被转换为如下的单词符号串
编译原理第三版 第三章 词法分析
超前搜索
例:FORTRAN语言中关键字的识别: DO99K=1,10 识别DO为关键字要搜 DO99K=1.10 索到“,” FORTRAN语言中常数的识别:
5.EQ.M, 5.E08
识别5为常数要搜索到Q
2、状态转换图
大多数程序设计语言中单词符号的词法规则可 以用正规文法描述。如: <标识符>→ 字母|<标识符>字母|<标识符>数字 <整数>→数字|<整数>数字 <运算符>→+|-|×|÷„ <界符>→; |, |( | )|„
#
3.3 正规表达式与有限自动机
目的: 形式化地描述词法规则和词法分析程序 词法分析程序的自动生成 主要内容 正规式与正规集 确定有限自动机 (DFA) 非确定有限自动机(NFA) 正规式与有限自动机的等价性 确定有限自动机的化简
正规文法
多数程序设计语言单词的语法都能用正规文法 (3型文法)描述 正规文法回顾 文法的任一产生式α→β的形式都为
单词符号的种类
(3) 常数 常数的类型一般有整型、实型、布 尔型、字符型等。
(4) 运算符 如 +,-,*,/等,对具体语言个 数是确定的。 (5) 界符 如 , ;()等,对具体语言个数是 确定的。
单词符号的表示形式
词法分析器所输出的单词符号常常表示成如下的 二元式:<单词种别,单词符号的属性值> 单词种别:由语法分析阶段使用的抽象符号。如: 用整数编码。 最简单的编码方案为一类一码,种别编码可设为: 1,2,3,4,5。 另一种编码方案(如本教材中): 标识符:列为一种,用一个整数编码表示; 常数:按类型分种编码; 关键字、运算符、界符:采用一字一种编码。
编译原理_-_陈火旺版_-_第三章new
预处理 子程序
输入 列表 输入缓冲区
扫描器 扫描缓冲区
单词符号
词法分析器的结构
编译原理
一、输入、预处理
输入串放在输入缓冲区中。
预处理子程序:剔除无用的空白、跳格、 回车和换行等编辑性字符;区分标号区、 捻接续行和给出句末符等
扫描缓冲区
↑
↑
起点 搜索
指示器 指示器
编译原理
二、单词符号的识别:超前搜索
2)对含回路的状态结,可对应一段由WHILE结构 和IF语句构成的程序.
字母或数字
i 其它 j
GetChar( ); while (IsLetter( ) or IsDigit( ))
GetChar( ); …状态j的对应程序段…
输入字符串x=aababb, 是否是该文法的句子? aa babb
SABABA Z
或写为:
(S)a→(A)a→(B)b→(A)a→(B)b→(A)b→Z Z是终止状态,所以,
输入字符串aababb是上述文法的句子。
为什么
可以通过运行状态转换图来识别正则文法的句子?
步骤 当前状态 输入的其余部分
Z
1
如果基本字、标识符和常数(或标号)之间没 有确定的运算符或界符作间隔,则必须使用一 个空白符作间隔。 DO99K=1,10 要写成 DO 99 K=1,10
编译原理
3 状态转换图的实现
思想:每个状态结对应一小段程序。
做法:
1)对不含回路的分叉结,可用一个CASE语句或 一组IF-THEN-ELSE语句实现
基本字:如 begin,repeat, 标识符——表示各种名字:如变量名、数组
名和过程名 常数:各种类型的常数 运算符:+,-,*,/, 界符:逗号、分号、括号和空白
编译原理 第 3 讲 词法分析 (2)
其中 • “”读为“或”(也有使用“+”代替 “” 的); • “• ”读为“连接”; • “”读为“闭包”(即,任意有限次的自重复连接)。 • 在不致混淆时,括号可省去。 • 规定算符的优先顺序为“”、“• ”、“” 。 • 连接符“• ”一般可省略不写。 • “”、“• ”和“” 都是左结合的。
“连接”的可结合律
4、r(st) = rsrt
(st)r = srtr
分配律
5、 r = r, r = r
是“连接”的恒等元素
6、 rr = r r = rrr…
“或”的抽取律
20
五、正规文法和正规式的等价变换
对上的正规式 r , 存在一个 G=(VN,VT,P,S) 使得 L(G) = L(r) , 反之亦然。
其中:l 表示字母;d表示数字
10
• 无符号实数:
〈无符号实数〉→ d 〈余留无符号数〉| . 〈十进小数〉 | e〈指数部分〉
〈余留无符号数〉→ d 〈余留无符号数〉| . 〈十进小数〉 | e〈指数部分〉|ε
〈十进小数〉 → d 〈余留十进小数〉 〈余留十进小数〉 → e〈指数部分〉| d 〈余留十进小数〉| ε 〈指数部分〉 → d 〈余留整指数〉| s〈整指数〉 〈整指数〉 → d 〈余留整指数〉 〈余留整指数〉 → d 〈余留整指数〉 |ε
f(Q,)= Q
递归定义
33
4. ∑* 上的符号串 t 被 M 接受
– 对于∑*中的任何字符串t,若存在一条从初态结点 到某一终态结点的道路,且这条路上所有弧的的 标记符连接成的字符串等于t,则称t可为DFA M 所接受,若M的初态结点同时又是终态结点,则 空字()可为M所接受(识别)。
– 若 t ∑*,f(S,t) = P,其中 S 为 DFA M 的开始 状态,P Z,Z为终态集。 则称 t 为 DFA M所接受(识别)。
编译原理 - 陈火旺版 - 第三章
f(V,a)=U f(V,b)=Q f(Q,a)=Q f(Q,b)=Q
S U V Q
a U Q U Q
b V V Q Q
21
确定有限自动机(DFA)
• 状态转换图
f(S,a)=U f(V,a)=U
f(V,b)=Q f(Q,a)=Q f(Q,b)=Q U b b a a a,b S Q b
3
3.1 词法分析器的要求
• 输入:源程序 • 输出:单词符号
– 单词是语言中具有独立意义的最小单位 – 分类
• 基本字:具有固定意义的标识符,
– 如Pascal中, begin, end
• 标识符:变量名、数组名、过程名等 • 常数:分为整型、实型、布尔型等
– 如 100, 0.8, TRUE
• 运算符:+、-、*、/等 • 界符:逗号,分号,括号等
24
非确定有限自动机(NFA)
• NFA: Nondeterministic Finite Automata • 定义:NFA M=S,,δ,S0,F,其中S为状态 的有限集, 为有穷字母表,δ为S * 到 S的子集(2 S)的映射,S0S是初始状态 集,F S为终止状态集。
25
NFA vs. DFA
一个确定有限状态自动机 DFA 是一个五元组 M = (S, ,δ,S0, F ).
有限状态集
有限输入符号集
转移函数 一个开始状态
δ : S S
S0 S FS
26
一个终态集合
NFA vs. DFA
一个非确定有限状态自动机 NFA 是一个五元组 M = (S, ,δ,S0, F ).
22
f(S,b)=V f(U,a)=Q f(U,b)=V a
编译原理第二版第3章词法分析
1. ε和φ都是∑上的正规式,它所表示的正规集分
别为{ε}和Ф; 2. 任何a∈∑,a是∑上的正规式,它所表示的正 规集为{a}; 3. 假定e1和e2都是∑上的正规式,他们所表示的 正规集分别为L(e1)和L(e2),那么,以下也 都是正规式和他们所表示的正规集;
一、正规式与正规集的递归定义
3.2 单词符号及输出单词的形式
单词自身值
对常数,基本字,运算符,界符就是他们本 身的值 对标识符,将标识符的名字登记在符号表中, ‚自身值‛是指向该标识符所在符号表中位 置的指针。
假定基本字、运算符和界符都是一符一种 例:if(a>1) b=100; 词法分析后输出的单词序列是: (2, ) if (29, ) ( (10,‘a’) a (23, ) > (11,‘1’) 1 (30, ) ) (10,’b’) b (17, ) = (11,‘100’) 100 (26, ) ;
4. 仅由有限次使用上述三步定义的表达式才是∑上的 正规式,仅由这些正规式所表示的字集才是∑上 的正规集。
重点回顾
四、将正规文法转换成正规式 求非终结符的正规式 将正规文法中的每个非终结符表示成关 于它的一个正规式方程,获得一个联立 方程组 用代入法解正规式方程组 最后只剩下一个开始符号定义的正规式, 其中不含非终结符
3.3 语言单词符号的两种定义方式
作用: 描述单词的构成规则,基于这类描 述工具建立词法分析技术,进而实现词法 分析程序的自动构造。 工具有: 正规文法 正规式(Regular Expression)
多数程序设计语言的单词符号都能用正 规文法或正规式来定义。
3.3.1 正规文法
多数程序设计语言单词的语法都能用正 规文法(3型文法)描述 正规文法回顾 文法的任一产生式α →β 的形式都为 A→aB或A→a,其中A ,B∈VN ,a∈VT A→Ba或A→a,其中A ,B∈VN ,a∈ VT 正规文法描述的是VT*上的正规集
编译原理课后答案(陈火旺)
第二章P36-6(1)L G ()1是0~9组成的数字串(2)最左推导:N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒0010120127334556568最右推导:N ND N ND N ND N D N ND N D N ND N ND N D ⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒⇒77272712712701274434886868568P36-7G(S)O N O D N S O AO A AD N→→→→→1357924680|||||||||||P36-8文法:E T E T E T TF T F T F F E i→+-→→|||*|/()| 最左推导:E E T T TF T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+********()*()*()*()*()*()*()最右推导:E E T E TF E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒+⇒⇒⇒⇒⇒+⇒+⇒+⇒+⇒+⇒+⇒+**********()*()*()*()*()*()*()*()语法树:/********************************EE FTE +T F F T +iiiEEFTE-T F F T -iiiE EFT+T F FTiii*i+i+ii-i-ii+i*i*****************/P36-9句子iiiei 有两个语法树:S iSeS iSei iiSei iiiei S iS iiSeS iiSei iiiei ⇒⇒⇒⇒⇒⇒⇒⇒P36-10/**************)(|)(|S T TTS S →→***************/P36-11/*************** L1:ε||cC C ab aAb A ACS →→→ L2:bcbBc B aA A ABS ||→→→ε L3:εε||aBb B aAb A ABS →→→ L4:AB B A A B A S |01|10|→→→ε ***************/第三章习题参考答案P64–7(1)101101(|)*1 ε ε 1 0 1 1确定化:0 1 {X} φ {1,2,3} φ φ φ {1,2,3} {2,3} {2,3,4} {2,3} {2,3} {2,3,4} {2,3,4} {2,3,5} {2,3,4}{2,3,5} {2,3} {2,3,4,Y} {2,3,4,Y}{2,3,5}{2,3,4,}1 00 0 1 1 00 1 0 1 1 1 最小化:X 1 2 3 4 Y5 XY60 12 35 4{,,,,,},{}{,,,,,}{,,}{,,,,,}{,,,}{,,,,},{},{}{,,,,}{,,}{,,,},{},{},{}{,,,}{,01234560123451350123451246012345601234135012345601231010==== 3012312401234560110112233234012345610101}{,,,}{,,}{,},{,}{},{},{}{,}{}{,}{,}{,}{}{,}{}{},{},{,},{},{},{}===== 0 10 0 1 00 1 0 1 1 1P64–8(1)01)0|1(*(2))5|0(|)5|0()9|8|7|6|5|4|3|2|1|0)(9|8|7|6|5|4|3|2|1(*(3)******)110|0(01|)110|0(10P64–12(a)aa,b a 确定化:a b {0} {0,1} {1} {0,1} {0,1} {1} {1} {0} φ φφφ给状态编号:a b 0125 01 2 4 3 011 12 2 03 333aaa b b bba 最小化:{,},{,}{,}{}{,}{}{,}{,}{,}{}{,},{},{}012301101223032330123a ba b ====a ab bab (b)b b aa baa bb aa a 已经确定化了,进行最小化 最小化:{{,}, {,,,}}012345011012423451305234523452410243535353524012435011012424{,}{}{,}{,}{,,,}{,,,}{,,,}{,,,}{,}{,}{,}{,}{,}{,}{,}{,}{{,},{,},{,}}{,}{}{,}{,}{,}a b a b a b a b a b a =============={,}{,}{,}{,}{,}{,}{,}10243535353524 b a b0 1 2 3 01 2 0 2 3 14 5b b aa b aP64–14(1) 01 0 (2):(|)*0100 1 ε ε0 确定化:0 1 {X,1,Y} {1,Y} {2} {1,Y} {1,Y} {2} {2} {1,Y} φ φφφ 给状态编号:0 1 0 1 2 1 1 2 2 1 3 33 30 1 01 1 10 最小化:0 1 2 01YX YX2 1 0 2 13{,},{,}{,}{}{,}{}{,}{,}{,}{}{,},{},{}0123011012231323301230101====1 1 1 0第四章P81–1(1) 按照T,S 的顺序消除左递归ε|,)(||^)(T S T T S T T a S S G '→''→→'递归子程序: procedure S; beginif sym='a' or sym='^' then abvance else if sym='(' then begin advance;T;if sym=')' then advance; else error; end else error end;procedure T; begin S;'T end;procedure 'T ; beginif sym=',' then begin advance; S;'T end1 3其中:sym:是输入串指针IP 所指的符号 advance:是把IP 调至下一个输入符号 error:是出错诊察程序 (2)FIRST(S)={a,^,(} FIRST(T)={a,^,(} FIRST('T )={,,ε} FOLLOW(S)={),,,#} FOLLOW(T)={)} FOLLOW('T )={)} 预测分析表a^() , # S S a →S →^S T →()TT ST →' T ST →' T ST →''T'→T ε '→'T ST ,是LL(1)文法P81–2文法:|^||)(|*||b a E P F F F P F T T T F T E E E T E →'→''→→''→+→''→εεε(1)FIRST(E)={(,a,b,^} FIRST(E')={+,ε} FIRST(T)={(,a,b,^} FIRST(T')={(,a,b,^,ε} FIRST(F)={(,a,b,^} FIRST(F')={*,ε} FIRST(P)={(,a,b,^} FOLLOW(E)={#,)} FOLLOW(E')={#,)} FOLLOW(T)={+,),#} FOLLOW(T')={+,),#}FOLLOW(F)={(,a,b,^,+,),#} FOLLOW(F')={(,a,b,^,+,),#} FOLLOW(P)={*,(,a,b,^,+,),#}考虑下列产生式:'→+'→'→'→E E T T F F P E a b ||*|()|^||εεεFIRST(+E)∩FIRST(ε)={+}∩{ε}=φ FIRST(+E)∩FOLLOW(E')={+}∩{#,)}=φ FIRST(T)∩FIRST(ε)={(,a,b,^}∩{ε}=φ FIRST(T)∩FOLLOW(T')={(,a,b,^}∩{+,),#}=φ FIRST(*F')∩FIRST(ε)={*}∩{ε}=φFIRST(*F')∩FOLLOW(F')={*}∩{(,a,b,^,+,),#}=φ FIRST((E))∩FIRST(a) ∩FIRST(b) ∩FIRST(^)=φ 所以,该文法式LL(1)文法. (3)+ * ( ) a b ^ # EE TE →'E TE →' E TE →' E TE →'E' '→+E E'→E ε'→E εTT F T →' T F T →' T F T →' T F T →'T' '→T ε '→T T '→T ε '→T T '→T T '→T T '→T εF F P F →' F P F →' F P F →' F P F →'F' '→F ε '→'F F * '→F ε '→F ε '→F ε '→F ε '→F ε '→F εPP E →() P a → P b → P →^(4)procedure E; beginif sym='(' or sym='a' or sym='b' or sym='^' then begin T; E' end else error endprocedure E'; beginif sym='+'then begin advance; E endelse if sym<>')' and sym<>'#' then error endprocedure T; beginif sym='(' or sym='a' or sym='b' or sym='^' then begin F; T' end else error endprocedure T';if sym='(' or sym='a' or sym='b' or sym='^' then Telse if sym='*' then errorendprocedure F;beginif sym='(' or sym='a' or sym='b' or sym='^' then begin P; F' endelse errorendprocedure F';beginif sym='*'then begin advance; F' endendprocedure P;beginif sym='a' or sym='b' or sym='^'then advanceelse if sym='(' thenbeginadvance; E;if sym=')' then advanceelse errorendelse errorend;P81–3/***************(1)是,满足三个条件。
编译原理chapter3 词法分析
18
3.2.2 手工构造识Байду номын сангаас单词的DFA m
根椐DFA识别单词的定义,在研究给定程 序语言单词结构的基础上,能直接构造出识 别它的DFA m。例如:对于Pascal,
标识符:字母开始的字母数字串。 整数:非空数字串。 无符号实数(用表示数字): (a) dd.d dE(+- ) dd
3.1.3 词法分析程序作为一个独立子程序 (1)语法分析程序的子程序; (2)组织成一遍扫描。
3
While i<>j do if i>j then i:=i-j else j:=j-
I
词法分析器
‘while’,‘i’,‘<>’,‘j’, ‘do’,
‘if’,‘i’,‘>’,‘j’,‘then’,
读头
11
2. 状态集:它记忆已读入w子串的状态,m 是奇偶校验器,它应该记住,初始序列是奇 数个1还是偶数个1。因此,m有even和odd两 个状态. 3 .even为开始状态。
4 . 转换函数,(qold , ,a)=qnew
m有: (even ,,0)=even (even ,1)=odd
(odd ,0)=odd (odd ,1)=even
5
词法分析器的输出:
(词类编码,单词自身的属性值)
词类编码提供给语法分析程序使用;单词自 身的属性值提供给语义分析程序使用。具体 的分类设计以方便语法分析程序使用为原则。 关键字可分成一类,也可以一个关键字分成 一类。常数可统归一类,也可按类型(整型、 实型、布尔型等),每个类型的常数划分成 一类。单词自身的属性值提供的内容,是由 词法分析和语义分析的任务划分决定的。
编译原理第3章课后习题答案
Dtran[I,b] =ε-closure(move(I,b))= ε-closure({5, 16})=G DFA D 的转换表 Dtran NFA 状态 {0,1,2,4,7} {1,2,3,4,6,7,8} {1,2,4,5,6,7} {1,2,4,5,6,7,9} {1,2,4,5,6,7,10,11,12,13,15} {1,2,3,4,6,7,8,12,13,14,15,17,18} {1,2,4,5,6,7, 12,13,15,16,17,18} {1,2,4,5,6,7, 9,12,13,15,16,17,18} {1,2,4,5,6,7, 10,11,12,13,15,16,17,18} 可得 DFA 的如下状态转换图: DFA 状态 A B C D E F G H I a B B B B F F F F F b C D C E G H G I G
3.3.1 给出 3.2.2 中正则表达式所描述的语言的状态转换图。
(1)a( a|b )*a 的状态转换图如下:
(2)
ε
ε a
b
(3)
a
start 0
a a a
1 2
4
b a b
5
b b
3
6
7
(4)a*ba*ba*ba*
a b
a b
a b
a
3.6.3 使用算法 3.25 和 3.20 将下列正则表达式转换成 DFA: (1)
注:consonant 为除五元音外的小写字母,记号 ctnvowels 对应的定义即为题目要求的正则
定义。
(2) 所有由按字典顺序递增序排列的小写字组成的串。 a*b*……z* (3)注释,即/*和*/之间的串,且串中没有不在双引号( “)中的*/。 head——>/* tail ——>*/ * * incomment->(~(*/)|“. ”) comment->head incomment tail (9)所有由 a 和 b 组成且不含有子串 abb 的串。 * * A->b (a︱ab)
编译原理课件chap03(陈火旺)
第三章 词法分析
3。2。2 单词符号的识别:超前搜索 词法分析器的结构图如图3。1所示。
源程序串
预处理 子程序
输入缓冲区
列表
扫描缓冲区 扫描器
单词符号
图3。1词法分析器
第三章 词法分析
当词法分析器调用预处理子程序处理 出一串输入字符串放进扫描缓冲区之后, 分析器就从此缓冲区中逐一识别单词符 号。当缓冲区里的字符串被处理完之后, 它又调用预处理程序装入新串。 下面我们来介绍单词符号识别的一 个简单方法-----超前搜索
第三章 词法分析
关键字的识别 像FORTRAN这样的语言,关键字不加保 护(只要不引起矛盾,用户可以用它们作为普 通标识符),关键字和用户自定义的标识符或 标号之间没有特殊的界符作间隔。这使得关键 字的识别甚为麻烦。请看下面例子: 1 DO99K=1,10 2 IF(5.EQ.M)I=10 3 DO99K=1.10 4 IF(5)=55 这四个语句都是正确的FORTRAN语句。 语句1和2分别是DO和IF语句,它们都是以某 基本字开头的。语句3和4是赋值语句,它们都 是以用户自定义的标识符开头的。
第三章
词法分析
编译程序首先是在单词级别上来分析和翻译 源程序的。词法分析的任务是:从左至右逐个字 符地对源程序进行扫描,产生一个个单词符号, 把作为字符串的源程序改造成为单词符号串的中 间程序。因此,词法分析是编译的基础。执行词 法分析的程序称为词法分析器。 •3。1 对词法分析器的要求
3.1.1 词法分析器功能和输出形式 输入源程序,输出单词符号。 程序语言的单词符号一般分为五种:关键字, 标识符,常数,运算符,界符
第三章 词法分析
对于2和4来说,必须超前扫描到与IF后的 左括号相对应的那个右括号之后的第一个字符 为止。若此字符是字母,则得逻辑IF。若此字 符为数字,则得算术IF。否则,应认为是用户 自定义标识符IF. 标识符的识别、常数的识别及算符和界符的 识别相类似可以参考课本P40,P41这里就不再 多述。 3。2。3 状态转换图 使用状态转换图是设计词法分析器的一种好 途径。转换图是一张有限方向图。在转换图中, 结点代表状态,用园圈表示。状态之间用箭弧 连结。箭弧上的标记(字符)代表在射出结点 (即箭弧始结点)状态下可能出现的输入字符 或字符类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
标识符的符号表入口地址作为其单词符号的属性值,常
每个基本字占一个单词种别,单词符号的属性值缺省。
对于界符,运算符通常一个符号一个种别,单词符号的
属性值缺省
例: 参见P42.表3.1 单词符号及种别编码
10
3.1.3 词法分析器作为独立子程序
词法分析可采用如下两种处理结构:
把词法分析程序作为主程序。将词法分析作为
19
3.2.1 正规文法、正规式与正规集
正规集:由正规文法产生的语言所构成的集合。
注:正规集是集合,可有穷也可无穷。 可通过正规式来形式化表示。
对于一个正规文法的语言提炼出一个简洁的公式,用这个
式子来对它进行形式化的表示,这个式子叫正规式。
正规式:也称正则表达式,是说明单词的模式的一种重要的 表示法(记号);是定义正规集的数学工具;用来描述单词 符号。
在设计一个编译程序时,通常是把对源程序的结构分析分为词 法分析和语法分析两个相对独立的阶段来完成。
第一,描述单词的结构比描述源程序的其它语法结构要简单
得多,仅使用3型文法也就基本够用了。
第二,由于把词法分析和语法分析分开,可使编译程序各部
分的功能更为单一,整个编译程序的结构也更加清晰,从而 有利于编译程序的编写和调整。 上述词法分析和语法分析两个阶段的划分,仅仅是对整个编译 程序的逻辑功能而言,而不一定指的是编译程序的执行流程。
25
例3.2 判断下述正规式之间是否等价: (1)b(ab)*与(ba)*b (2)(ab)*与a*b* 解: (1) b(ab)*对应的正规集是b后面出现任意多个ab对
L(b(ab)*)={b,bab,babab, ……}
(ba)*b对应的正规集是b前面可出现任意个ba对 L((ba)*b)={b,bab,babab, ……}, 因此两者等价。
例如:FORTRAN语言:
1.DO10K=1,50 2.DO10K=1.50
扫描缓冲区的结构 (自学)
14
词法分析程序设计
设计方法:
⑴写出该语言的词法规则; ⑵把词法规则转换为相应的状态转换图; ⑶把各转换图的初态连在一起,构成识别该 语言的自动机; (4)设计扫描器
17
3.2 正规文法和有限自动机
标识符:统归为一种; 常数:统归为一种,或按整、实、布尔等再分; 运算符和界符:一符一种,或统归为一种。
8
3.1.2 词法分析器的输出形式
单词符号的属性值
单词符号的属性是指单词符号的特征值 。
如果一个种别只含有一个单词符号,那么对于这
个单词符号,种别编码就完全代表它自身了,因 而不需要属性值。
独立的一遍来完成。
把词法分析程序作为语法分析程序调用的子程
序。
每当语法分析器需要一个单词符号时就调用这个子程
序。
每一次调用,词法分析器从源程序字符串中识别出一
个单词符号,并把它的内部表示二元组交给语法分析 器处理。
11
3.1.4 源程序的输入、预处理 及超前搜索
词法分析器工作的第一步是输入源程序文本。 输入串一般放在一个输入缓冲区中。词法分 析器的工作可以直接在输入缓冲区中进行。 但在许多情况下,可以先预处理输入串,识 别工作将更方便。(参见P40 图3.1)
21
3.2.1 正规文法、正规式与正规集
下面是正规式和它所定义的正规集的递归定义。
1) ε ,φ 是 ∑ 上的正规式, 所表示的正规集为 {ε},{ }; 2) 若 a∈∑,则 a 为正规式, 所表示的正规集为 {a}; 3) 设U,V 为 ∑ 上的正规式, 所表示的正规集为 L(U),L(V); 则 U|V为 ∑ 上的正规式, 所表示的正规集为 L(U) ∪ L(V);
正规式b(ab)*及(ba)*b都描述以b开头且其后跟以零个或任意 多个ab所组成的字符串等。故我们说两个正规式等价,
(2)(ab)*对应的正规集以任意个ab对出现,即 ababab…, 而a*b*对应的正规集则是任意个a后接任意个b, 即 a…ab…b, 因此两者不等价。 26
例3.3: 设 =a,b, 则正规式和正规集: a,b ① ab ②(ab)(ab) aa,ab,ba,bb * ,a,aa,aaa,aaaa,…= {an|n≥0} ③ a {,a,b,aa,ab,ba,bb,aaa,aab,abb, ④(ab)* bab,bba,bbb ... = {a, b}* {a,ab,abb,abbb,abbbb,... ⑤aab* = { abn |n≥0}
理解:
正规文法与有穷自动机间的转换 词法分析器的自动产生工具LEX
教学要求
2
本章在编译程序中的地位
源程序
词法分析器
单词符号 表 格 管 理 优化器 中间代码 目标代码生成器 目标代码
3
语法分析器 语法单位 语义分析与中间代码产生 中间代码
出 错 处 理
3.1 设计词法分析器时应考虑的几个问题
④输出源程序清单以便复核。
预处理子程序任务
①从输入缓冲区中读取源程序,预处理后送入扫描缓冲 区。此时,扫描缓冲区的字符都是有效字符。 13 ②词法分析程序这时可以再对扫描缓冲区进行扫描。
3.1.4 源程序的输入、预处理及 超前搜索
超前搜索
对于有些语言,关键字不保护,关键字与用户自定义标
识符间没有界符,要在上下文环境中识别单词,这时需要 超前搜索方法来识别关键字。
若一个种别含有多个单词符号,那么,对于它的
每个单词符号,除了给出种别编码之外,还应给 出有关单词符号的属性值。
9
3.1.2 词法分析器的输出形式
单词符号的属性值
标识符和常数
标识符的内部码
(如ASCII码等等)和常数本身的值 (二 进制,逻辑值等)来表示。 量在其常量表中的入口地址作为其单词符号的属性值。
20
3.2.1 正规文法、正规式与正规集
下面以标识符为例说明正规式与正规集:
标识符是以字母开头的字母数字串。
若用L表示字母, 用D表示数字,
则标识符可表示为: L(L|D)* 其中并臵表示两者的 连接, |表示两者选一, *表示零次或多次引用。 L(L|D)* 为标识符的正规式, 该正规式表示的集合为标识符的正规集。
或运算
U·V为 ∑ 上的正规式, 所表示的正规集为 L(U) L(V);
V* 为 ∑ 上的正规式, 所表示的正规集为 (L(V))* ;
连接积
4) 仅当有限次使用上述三步骤而定义的表达式,才是∑ 上的正
22
规式 ,而这些正规式所表示的字集才是∑上的正规集。
3.2.1 正规文法、正规式与正规集
说明: 1>Σ上的一个字指的是由Σ中字符构成的一个有穷序列; 不包含任何字符的序列称为空字(ε)。 Σ*表示Σ上所有字的全体, 包括空字(ε)。 例如, 若Σ={a, b} 则Σ*={ε, a, b, aa, ab, ba, bb, aaa, …} 2> Ф表示不含任何元素的空集{ }。 注意ε、{ }和{ε}的区别: ε表示不包含任何字符的序列,它是正规集中的一个元素; { }表示不含任何字的集合, 它是一个空的正规集; {ε}表示由空字组成的集合。
执行词法分析的程序称为又称为词法分析器 或扫描器. 词法分析的任务:从左至右逐个地扫描源程 序的字符串, 按照词法规则识别出一个个正确 的单词,并转换为相应的二元式形式,交给 语法分析使用。
把作为字符串的源程序改造成单词符号串的 词法分析是编译的基础。
4
3.1.1 词法分析阶段的必要性
词法分析的工作纳入整个语法分析中一揽子地进行,原则上是 可行的。
28
例3.5: 令Σ={A,B,0,1} , 则: 正规式 正规集 Σ上的“标识符”的全体 1. (A|B)(A|B|0|1)*
={A,B}.{A,B,0,1}*
2.
(0|1)(0|1)*
Σ上“数”的全体 ={0,1}.{0,1}*
3.
问: 正规式 ε, φ, 0 , 110 , 0|1 , 1* 表示的正规 集是?
关键字(保留字或基本字):如
if,then,else,while,do等
标识符:用来表示各种名字,如 x1 常量:如 256,3.14,true, ’abc’
运算符:如 +、-、*、/ 等等
分界符:如 逗号,分号,冒号等
7
3.1.2 词法分析器的输出形式
单词种别: 一个语言的单词符号如何分类、分为几类、如 何编码主要取决于处理上的方便。通常,每种单词 对应一个整数码。 注意:保留字、运算符和界符的个数确定, 标识符和常数的个数不确定。 保留字:可全体视为一种,也可一字一种;
12
3.1.4 源程序的输入、预处理及 超前搜索
预处理的原因
①源程序中包含回车,换行,多余空白符,注释行等编辑字 符, 它们对程序逻辑功能无任何影响, 在词法分析之前,首 先要剔除掉这些符号,使得词法分析更为简单。 ②一行语句结束应配上一个特殊字符说明。
③有些语言要识别标号区,区分标号语句,找出续行符连 接成完整语句等。
5
3.1.2 词法分析器的输出形式
词法分析器输出的单词常常表示为二元式形式
(单词种别,单词符号的属性值)
单词种别提供给语法分析程序使用;
单词符号的属性值提供给语义分析程序使用。
具体的分类设计方法以方便语法分析程序使用为
原则。
6
3.1.2 词法分析器的输出形式
程序语言的单词符号一般分为五种:
解: L(R)=L(a(a|b)*)=L(a)L((a|b)*) =L(a)(L(a|b))*=L(a)(L(a)∪L(b))*