第三章_词法分析(1)
合集下载
《编译原理》第3章
NFA到相应的DFA的构造的基本思路是: DFA的每 一个状态对应NFA的一组状态. DFA使用它的状 态去记录在NFA读入一个输入符号后可能达到的 所有状态.
NFA M所能接受的符号串的全体记为L(M)
结论:
上一个符号串集V是正规的,当且仅当存 在一个上的不确定的有穷自动机M,使得 V=L(M)。
DFA是NFA的特例.对每个NFA N一定存在一个DFA M,使得 L(M)=L(N)。对每个NFA N存在着与之 等价的DFA M。 有一种算法,将NFA转换成接受同样语言的DFA.这 种算法称为子集法. 与某一NFA等价的DFA不唯一.
0
1
S P
Z
{P} {}
{P}
{S,Z} {Z}
{P}
• δ为S * 到S的子集(2 S)的一种映射
• 从NFA的矩阵表示中可以看出,表项通常是一状态的集合, 而在DFA的矩阵表示中,表项是一个状态
∑*上的符号串t被NFA M接受:
• 对于Σ*中的任何一个串t,若存在一条从某一初态 结点到某一终态结点的道路,且这条道路上所有 弧的标记字依序连接成的串(不理采那些标记为ε 的弧)等于t,则称t可为NFA M所识别(读出或接 受)。 • 若M的某些结点既是初态结点又是终态结点;或 者存在一条从某个初态结点到某个终态结点的道 路,其上所有弧的标记均为ε,那么空字ε可为M所 接受。
其中: δ(S,0)={P}
δ(S,1)={S,Z} δ(Z,0)={P} δ(Z,1)={P} δ(P,1)={Z} • 状态图表示
1 1 S 0 0,1 Z
P
1
• 矩阵表示
状态 输入
δ(S,0)={P} δ(S,1)={S,Z} δ(Z,0)={P} δ(Z,1)={P} δ(P,1)={Z}
编译原理词法分析
❖ 数字:继续读,直到非数字字符出现或文件尾。输 出无符号整数的单词记号及数字串;
❖ =、<、>、!:读下一个字符,判断是否为双字 符分界符,若是,组成双字符分界符,输出类码; 若不是,输出单分界符记号;
编译原理
❖ 非=、<、>、/等与双分界符首字符不同的单分界 字符:输出相应单词记号及单分界符。
1.S是一个有穷集,它的每个元素称为一个状态;
2.Σ是一个有穷字母表,它的每个元素称为一个输入 符号,所以也称Σ为输入符号表;
3.δ是在S×Σ→S上的单值映射,即,如δ (s,a)=s’, (s∈S,s’∈S)就意味着,当前状态为s,输入符为 a时,将转换为下一个状态s’,我们把s’称作s的一 个后继状态;
编译原理 在 入 准初带备整•••始的读输读有个时开入始入头穷模,始,状带:控型读位状态:可制由头置态存以器如状的所三处,处放在:果态符识部于表于输输控读正号别分输示初入入制头好组组符带状移是成成号上态动终的:向发到结字后生最状能移变后态被头每有动化一,该转向读穷个则有移后入控符输限到移一 制号入自下动个器后带动一一符控面上机个个号制,状位,状态置读态,
编译原理
词法分析 读字符
结束 Y
结束
N Y 空字
N 字母 N 数字
Y 组合标识符 Y 组合整数
查保留字Βιβλιοθήκη N 纯单分符Y 输出单分符
N
>,<,!,= Y 读字符
=
N
N
/ Y 读字符
*
N
Y
错误处理
输出保留字
Y 保留字
N 输出标识符
组合整数
读字符
Y 输出双分符
输出单分符 N 输出单分符/
注释处理
读字符
❖ =、<、>、!:读下一个字符,判断是否为双字 符分界符,若是,组成双字符分界符,输出类码; 若不是,输出单分界符记号;
编译原理
❖ 非=、<、>、/等与双分界符首字符不同的单分界 字符:输出相应单词记号及单分界符。
1.S是一个有穷集,它的每个元素称为一个状态;
2.Σ是一个有穷字母表,它的每个元素称为一个输入 符号,所以也称Σ为输入符号表;
3.δ是在S×Σ→S上的单值映射,即,如δ (s,a)=s’, (s∈S,s’∈S)就意味着,当前状态为s,输入符为 a时,将转换为下一个状态s’,我们把s’称作s的一 个后继状态;
编译原理 在 入 准初带备整•••始的读输读有个时开入始入头穷模,始,状带:控型读位状态:可制由头置态存以器如状的所三处,处放在:果态符识部于表于输输控读正号别分输示初入入制头好组组符带状移是成成号上态动终的:向发到结字后生最状能移变后态被头每有动化一,该转向读穷个则有移后入控符输限到移一 制号入自下动个器后带动一一符控面上机个个号制,状位,状态置读态,
编译原理
词法分析 读字符
结束 Y
结束
N Y 空字
N 字母 N 数字
Y 组合标识符 Y 组合整数
查保留字Βιβλιοθήκη N 纯单分符Y 输出单分符
N
>,<,!,= Y 读字符
=
N
N
/ Y 读字符
*
N
Y
错误处理
输出保留字
Y 保留字
N 输出标识符
组合整数
读字符
Y 输出双分符
输出单分符 N 输出单分符/
注释处理
读字符
第三章 词法分析精选版演示课件.ppt
gjgj
11
串和语言(3)
• 串的运算
– 连接(concatenation):x和y的连接时把y附加到x 的后面形成的串,记作xy。
• x=dog,y=house,xy=doghouse
– 指数运算(幂运算):s0=ε,s1=s,si=si-1s;
• x=dog,x0=ε,x1=dog,x3=dogdogdog
第三章 词法分析
赵建华 南京大学计算机系
2009年2月
gjgj
1
内容
• 词法分析器的作用 • 词法单元的规约 • 词法单元的识别 • 词法分析器生成工具Lex • 有穷自动机 • 从正则表达式到自动机 • 词法分析器生成工具的设计方法
gjgj
2
词法分析器的作用
• 读入源程序字符流、组成词素,输出词法单元序列。 • 过滤空白、换行、制表符、注释等。 • 将词素添加到符号表中。 • 在逻辑上独立于语法分析,但是通常和语法分析器
器通过单元名即可确定词法单元序列的结构。
– 属性值通常用于语义分析之后的阶段
• 模式
– 描述了一类词法单元的词素可能具有的形式
• 词素
– 源程序中的字符序列 – 它和某个词法单元的模式匹配,被词法分析器识别
为该词法单
• printf(“Total = % d\n”, score);
– printf, score和标识符(id)的模式匹配 – “Total = % d\n”和literal的模式匹配
gjgj
6
词法单元的属性
• 一个模式匹配多个词素时,必须通过属性 来传递附加的信息。属性值将被用于语义 分析、代码生成等阶段。
• 不同的目的需要不同的属性。因此,属性 值通常是一个结构化数据。
第三章词法分析
根据定义比较容易证明上述性质,利用这些性质可以化简正规式,证明 正规式的等价关系
说明:*上的某些集合若不能用正规表达式表示,则该集合不是正规集。 如: ={a,b},L(G)={anbn| n0}就不是正规集,因为它不能用正规式表示。 (可以用上下文无关文法Z∷=aZb|ab|ε产生)可以证明,凡是由正规文 法所产生的语言一定是正规集,即可由正规式表示 。
18
第三章 词 法 分 析
§3.6正规表达式和有穷自动机
一、正规表达式和正规集的定义
1.非形式定义 2.递归定义
二、正规表达式的性质 三、正规文法、正规表达式与有穷自动机的关系 四、由正规表达式构造确定有穷自动机
1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机DFA(子集法) 3.由正规文法构造正规表达式
1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机DFA(子集法) 3.由正规文法构造正规表达式
五、确定有穷自动机的化简
1.等价和可区分的概念 2.确定有穷自动机的化简方法
2
§3.6正规表达式和有穷自动机
为什么引入正规表达式?
由正规文法构造状态转换图,再根据状态转换 图可以构造有穷自动机,往往很麻烦,但是, 对于一些复杂的正规文法,如果将其先转换成 正规表达式,再由正规表达式来产生有穷自动 机就方便得多。而且正规表达式的引入有助于 词法分析程序的自动生成,它还广泛应用于模 式识别和文献目录检索等。
五、确定有穷自动机的化简
1.等价和可区分的概念 2.确定有穷自动机的化简方法
16
第三章 词 法 分 析
§3.6正规表达式和有穷自动机
一、正规表达式和正规集的定义
1.非形式定义 2.递归定义
说明:*上的某些集合若不能用正规表达式表示,则该集合不是正规集。 如: ={a,b},L(G)={anbn| n0}就不是正规集,因为它不能用正规式表示。 (可以用上下文无关文法Z∷=aZb|ab|ε产生)可以证明,凡是由正规文 法所产生的语言一定是正规集,即可由正规式表示 。
18
第三章 词 法 分 析
§3.6正规表达式和有穷自动机
一、正规表达式和正规集的定义
1.非形式定义 2.递归定义
二、正规表达式的性质 三、正规文法、正规表达式与有穷自动机的关系 四、由正规表达式构造确定有穷自动机
1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机DFA(子集法) 3.由正规文法构造正规表达式
1.由正规表达式e构造转换系统 2.由转换系统构造确定有穷自动机DFA(子集法) 3.由正规文法构造正规表达式
五、确定有穷自动机的化简
1.等价和可区分的概念 2.确定有穷自动机的化简方法
2
§3.6正规表达式和有穷自动机
为什么引入正规表达式?
由正规文法构造状态转换图,再根据状态转换 图可以构造有穷自动机,往往很麻烦,但是, 对于一些复杂的正规文法,如果将其先转换成 正规表达式,再由正规表达式来产生有穷自动 机就方便得多。而且正规表达式的引入有助于 词法分析程序的自动生成,它还广泛应用于模 式识别和文献目录检索等。
五、确定有穷自动机的化简
1.等价和可区分的概念 2.确定有穷自动机的化简方法
16
第三章 词 法 分 析
§3.6正规表达式和有穷自动机
一、正规表达式和正规集的定义
1.非形式定义 2.递归定义
第3章词法分析
例:语言L[G]={abn|n>=1},其正规文 语言L[G]={ab |n>=1},其正规文 法为G[A]: 法为G[A]: A→aB A→aB B→bB| B→bB| b 画出状态转换图
例:部分单词的状态图
Letter,digit
s
letter digit
其它 (IDN,入口) ,入口) digit 其它 (NUM,值) , (ASG,_) , ) =
3.2 状态转换图
•识别标识符的流程图 识别标识符的流程图 开始
出口 N N 数字 Y
字母 N 出口
Y
取字符
字母 Y
结点:状态用○表示;终态用◎表示 结点:状态用○表示;终态用◎ 有向弧 弧标记 初态 开始 1 letter 2 ── 箭头 ── 输入字符 Letter,d号的表示
• 常用单词种别 常用单词种别——分类 分类
–各关键字(保留字、基本字) 各关键字(保留字、基本字) 各关键字 –各种运算符 各种运算符 –各种分界符 各种分界符——各用一个种别码标识(特定符号类) 各用一个种别码标识( 各种分界符 各用一个种别码标识 特定符号类) –其它标识符 其它标识符——用一个种别码标示(非特定符号类) 用一个种别码标示( 其它标识符 用一个种别码标示 非特定符号类) –常数 常数——用一个种别码标示(非特定符号类) 用一个种别码标示( 常数 用一个种别码标示 非特定符号类)
• 例:文法 文法G[Z]: : • Z→ Z→Za| Aa| Bb • A→ A→Ba | a • B→ B→Ab| b • 画出状态转换图
2、从右线性正规文法出发,构造状态图 从右线性正规文法出发, 以每个非终结符为状态结点, 1. 以每个非终结符为状态结点 , 开始符号 对应初态S 对应初态S ; 2.增设一个终态 Z; 3. 对于规则 A→aB , 画从状态 A 到 B 的 A→aB, 弧,标为 a; A→a, 4. 对于规则 A→a , 画从状态 A 到终态 Z 的弧, 的弧,标为 a。
编译原理之词法分析PPT课件
–直接管理源程序字符流的读入
12
Wensheng Li BUPT @ 2008
二、设置缓冲区的必要性
超前搜索:为了得到某一个单词符号的确切性质, 需要超前扫描若干个字符。
例:有合法的FORTRAN语句: DO99K=1,10 和 DO99K=1.10
为了区别这两个语句,必须超前扫描到等号后的第一个 分界符处。
开始指针 向前指针
16
Wensheng Li BUPT @ 2008
测试指针的过程(2)
向前指针前移一个位置; IF (向前指针指向 eof ) {
IF (向前指针在左半区的终点) { 读入字符串,填充右半区; 向前指针前移一个位置;
}; ELSE IF (向前指针在右半区的终点) {
读入字符串,填充左半区; 向前指针指向缓冲区的开始位置; }; ELSE 终止词法分析; }
P1
P2
唤醒P2 唤醒P2
唤醒P1 唤醒P1
Wensheng Li BUPT @ 2008
8
分离词法分析程序的好处
可以简化设计
–词法程序很容易识别并去除空格、注释,使语法分析程序 致力于语法分析,结构清晰,易于实现。
可以改进编译程序的效率
–利用专门的读字符和处理记号的技术构造更有效的词法分 析程序。
11
Wensheng Li BUPT @ 2008
一、词法分析程序的实现方法
利用词法分析程序自动生成器
–从基于正规表达式的规范说明自动生成词法分析程序。 –生成器提供用于源程序字符流读入和缓冲的若干子程序
利用传统的系统程序设计语言来编写
–利用该语言所具有的输入/输出能力来处理读入操作
利用汇编语言来编写
基本方法
12
Wensheng Li BUPT @ 2008
二、设置缓冲区的必要性
超前搜索:为了得到某一个单词符号的确切性质, 需要超前扫描若干个字符。
例:有合法的FORTRAN语句: DO99K=1,10 和 DO99K=1.10
为了区别这两个语句,必须超前扫描到等号后的第一个 分界符处。
开始指针 向前指针
16
Wensheng Li BUPT @ 2008
测试指针的过程(2)
向前指针前移一个位置; IF (向前指针指向 eof ) {
IF (向前指针在左半区的终点) { 读入字符串,填充右半区; 向前指针前移一个位置;
}; ELSE IF (向前指针在右半区的终点) {
读入字符串,填充左半区; 向前指针指向缓冲区的开始位置; }; ELSE 终止词法分析; }
P1
P2
唤醒P2 唤醒P2
唤醒P1 唤醒P1
Wensheng Li BUPT @ 2008
8
分离词法分析程序的好处
可以简化设计
–词法程序很容易识别并去除空格、注释,使语法分析程序 致力于语法分析,结构清晰,易于实现。
可以改进编译程序的效率
–利用专门的读字符和处理记号的技术构造更有效的词法分 析程序。
11
Wensheng Li BUPT @ 2008
一、词法分析程序的实现方法
利用词法分析程序自动生成器
–从基于正规表达式的规范说明自动生成词法分析程序。 –生成器提供用于源程序字符流读入和缓冲的若干子程序
利用传统的系统程序设计语言来编写
–利用该语言所具有的输入/输出能力来处理读入操作
利用汇编语言来编写
基本方法
编译原理第三章作业
{A2,A3,A4,A6} T5 {A2,A5,A3}=T4
Ti1 {A1,A2,A3}=T1 {A2,A4,A3}=T3 {A2,A4,A3}=T3 {A2,A4,A3}=T3 {A2,A4,A6,A3}=T5 {A2,A4,A3}=T3
Ti {A0}
Ti0 T0 { }
{A1,A2,A3} T1 {A2,A3 }=T2
错误3:转换到这一步S = 01S|01|10S|10的时候,
=(01S|01) | (10S|10)
由S=01S|01,得 S=(01)*(01)
由S=10S|10,得S=(10)*(10)
最终得正规式(01)*(01) | (01)*(01),是错误的 规则2:A→xA|y 得A=x*y 规则3:A→x|y (A→x A→y)得A=x|y
用规则2:A→xA|y 得 A=x*y S = (01|10)*(01|10)
作业中的问题 正规文法到正规式可以直接转换,不用将正规 文法转换成DFA,再将DFA转换成正规式
错误1:将(01|10)*(01|10)写成= (01|10)*
错误2:将(01|10)*(01|10)写成(01|10)+,在正规式 中可以出现的算符只有‘.’,‘*’, ‘(’, ‘)’, ‘|’,没有‘+’
而错误的转换(01)*(01) | (01)*(01),描述的是 01组成的任意长的串,如010101…或者10组 成的任意长的串101010…,与原文法描述的 语言不等
(0|1)* 1
0
3
1 Y
1
2
4
0|1
1
ε
ε
1
0
1
X
3
Y
1
编译原理第二版第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*上的正规集
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*上的正规集
编译原理第三章词法分析
L→ a | b | … | z | A | B | … | Z D → 0 | 1 | … | 9 <标识符> → L(L|D|_)* <无符号正整数> → DD*
z19
step1 : 对语言的各类单词分别构造状态图;
step1
L
1
2
other
*
3 其中: other表示非L| D | _字符
z8
3.2.1 单词与属性字
注意:
(1) 同一个字符开头+后续字符->跨多个单词类;
(2) 非单词成分和预处理成分;
•例:源程序注释;/* …….*/
预处理指令:
•# define… # include…
z9
3.2.1 单词与属性字
2. 属性字 对所识别的单词的数据结构表示。
控制线
数据线
X : 固定长度的存储空间 ; z16
预处理程序(作用)
(1) 减少内存空间占用;
(2) 减轻扫描器实质性处理的负担;
预处理程序主要任务:
(1) 滤掉源程序中的非单词成分(如无用空格;换行
符等);
•滤掉注释;
(2) 实际的预处理工作
•宏替换; •文件包含的嵌入;
L1= ( T,C)
属性字 Token
Code
刻画单词类别(单词性质)
如:标识符;运算符;…
单词的内码值(可空)
z10
说明
单词类别通常用整数编码 单词类别提供给语法分析程序使用 单词符号属性信息记录单词符号的特征或特性 单词的属性值提供给语义分析程序使用
编码形式:
一类一种:关键字、标识符、常数、运算符、界符 一字一种:关键字、运算符、分界符各一码
z19
step1 : 对语言的各类单词分别构造状态图;
step1
L
1
2
other
*
3 其中: other表示非L| D | _字符
z8
3.2.1 单词与属性字
注意:
(1) 同一个字符开头+后续字符->跨多个单词类;
(2) 非单词成分和预处理成分;
•例:源程序注释;/* …….*/
预处理指令:
•# define… # include…
z9
3.2.1 单词与属性字
2. 属性字 对所识别的单词的数据结构表示。
控制线
数据线
X : 固定长度的存储空间 ; z16
预处理程序(作用)
(1) 减少内存空间占用;
(2) 减轻扫描器实质性处理的负担;
预处理程序主要任务:
(1) 滤掉源程序中的非单词成分(如无用空格;换行
符等);
•滤掉注释;
(2) 实际的预处理工作
•宏替换; •文件包含的嵌入;
L1= ( T,C)
属性字 Token
Code
刻画单词类别(单词性质)
如:标识符;运算符;…
单词的内码值(可空)
z10
说明
单词类别通常用整数编码 单词类别提供给语法分析程序使用 单词符号属性信息记录单词符号的特征或特性 单词的属性值提供给语义分析程序使用
编码形式:
一类一种:关键字、标识符、常数、运算符、界符 一字一种:关键字、运算符、分界符各一码
第三章_词法分析
∑*的子集U和V的连接(积)定义为
UV { | U, V}
V自身的 n次积记为 V n VV V
n
规定V0={},令
V * V 0 V1 V 2 称V*是V的闭包;
记 V VV * V 1 V 2
称V+是V的正规闭包。
3.3.1 正规式与正规集
有限自动机
有限自动机所讨论的问题
确定的有限自动机DFA 不确定的有限自动机NFA NFA的确定化 DFA的最小化
标识符单列一种;标识符自身的值表示成按机器字节划分 的内部码。
常数按类型分种;常数的值则表示成标准的二进制形式。
3.1.1 词法分析器的功能和输出形式
例 FORTRAN程序
IF (5.EQ.M) GOTO 100 输出单词符号: 逻辑IF (34,-) 左括号 (2,-) 整常数 (20, ‘5’的二进制) 等号 (6,-) 标识符 (26, ‘M’) 右括号 (16,-) GOTO (30,-) 标号 (19, ‘100’的二进制)
END;
状态转换图实现示例
'0'..'9':
BEGIN WHILE DIGIT DO BEGIN CONCAT;GETCHAR END; RETRACT; RETURN ($INT,DBT)
END;
'=': RETURN ($ASSIGN,-); '+': RETURN ($PLUS,-);
状态转换图实现示例
4 算符和界符的识别
把多个字符符合而成的算符和界符拼合成一个 单一单词符号。:=, **, .EQ.
3.2.3 状态转换图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.2 词法记号、模式、词法单元
词法记号(token):源语言文法的终结符,用 <token name, token value>表示。 模式(pattern):源语言中特定记号的构成规则, 可以用正则表达式示。 词法单元(词素,lexeme):源程序中和记号的模式 相匹配的字符串。
第三章 词法分析
2012-8-15
1
本章内容
词法分析器:将源程序的字符流翻译成记号流,以 及用户接口等任务 构造词法分析器 手工 自动生成 重点 正则表达式 有限状态自动机 自动生成工具:Lex/Flex
2012-8-15 编译原理 2
3.1 词法分析器的作用
记号 源程序 词法分析器 语法分析器
2012-8-15
编译原理
10
3.1.3 词法记号的属性
用二元组<记号,属性值>表示;属性一般用符号表的指针来 表示 例如,position := initial + rate * 60 id,指向符号表中position条目的指针 assign _ op, id,指向符号表中initial条目的指针 add_op,+ id,指向符号表中rate条目的指针 mul_ op, * num,整数值60
2012-8-15 编译原理 15
语言(Language)
语言(Language):某个给定字母表上一个任意可数 的字符串集合。 Special Languages: and {}
2012-8-15
编译原理
16
语言的例子
Alphabet {0,1} Languages {1,10,100,1000,100000…} {0,1,00,11,000,111,…} {a,b,c} {abc,aabbcc,aaabbbccc,…} {A, … ,Z} {TEE,FORE,BALL,…} {FOR,WHILE,GOTO,…} {A,…,Z,a,…,z,0,…9, { All legal C programs} +,-,…,<,>,…} { All grammatically correct English sentences }
2012-8-15 编译原理 21
3.2.3 正则表达式
例如,C语言的标识符集可以定义为: letter_ (letter_ | digit )* 正则式(Regular Expression)用来表示简单的语言, 叫做正则集
2012-8-15
编译原理
22
定义字母表上的正则表达式的规则
p r e c e d e n c e
(a) (r) | (s) is a regular expression L(r) L(s) (b) (r)(s) is a regular expression L(r) L(s)
(c) (r)* is a regular expression (L(r))*
DEFINITION
L M = { s | s is in L or s is in M} LM = { st | s is in L and t is in M}
concatenation of L and M Kleene closure of L positive closure of L
2012-8-15
编译原理
14
字符串例子及术语
Suppose: S is the string banana
Prefix : ban, banana Suffix : ana, banana
子串(Substring) : nan, ban, ana, banana
子序列(Subsequence): bnan, nn Proper prefix Proper suffix Propersubstring
2012-8-15 编译原理
备注
a r和s是正则式 r和s是正则式 r是正则式 r是正则式
24
正则表达式的例子( = {a, b})
RE RL a|b {a, b} (a | b) (a | b ) {aa, ab, ba, bb} aa | ab | ba | bb {aa, ab, ba, bb} a* 由0个或多个a构成的所有字符串集合 (a | b)* 由a和b构成的所有字符串集合 …… a | a*b 复杂的例子 ( 00 | 11 | ( (01 | 10) (00 | 11) (01 | 10) ) ) 偶数个0和偶数个1组成的01字符串
2012-8-15 编译原理 17
串的运算
连接 xy s = s = s 乘积(指数) 定义s0为,si为si-1s(i > 0) s1=s, s2=ss, s3=sss,…
2012-8-15
编译原理
18
3.2.2 语言上的运算
OPERATION
union of L and M
1. is a regular expression denoting { }
2. If a is in , a is a regular expression that denotes {a} 3. Let r and s be regular expressions with languages L(r) and L(s). Then
DESCRIPTION | is commutative | is associative concatenation is associative concatenation distributes over | is the identity element for concatenation relation between * and * is idempotent
正则表达式是模式的重要表示方法。
2012-8-15
编译原理
13
3.2.1 串和语言
字母表:有限符号的集合,例: = {0,1} 字符串:符号的有穷序列,例:0110, 字符串s的长度:出现在s中符号的个数,记作|s| 空串:长度为0的符号串,用表示 语言:给定字母表上的任意一个字符串集合 {,0,00,000,…}, {}, 句子:属于语言的字符串
(d) (r) is a regular expression L(r)
编译原理 23
All are Left-Associative. 2012-8-15
正则式 定义的语言 {} a {a} (r) | (s) L(r)∪L(s) (r)(s) L(r)L(s) (r)* (L(r))* (r) L(r) ((a) (b)*)| (c)可以写成ab*| c
2012-8-15
编译原理
7
example
C statement: printf(“total=%d”, score) <id, printf> <(, > <literal, “total=%d”> <,, > <id, score> <), >
2012-8-15
编译原理
取下一个记号 符号表
2012-8-15
编译原理
3
Lexical rules Genertor
(eg. Lex or Flex)
Stream of characters
scanner
Stream of tokens
2012-8-15
编译原理
4
词法分析器的主要任务
读入输入字符,产生token序列,交给语法分析使 用; 相关辅助任务 过滤注释、空格等; 为了报错,记录每个token在源文件中的位置
2012-8-15
编译原理
5
3.1.1 词法分析中的问题
Simplicity of design is the most important consideration. Compiler efficiency is improved. Compiler portability is enhanced.
2012-8-15 编译原理 28
正则定义的例子1
C语言的标识符集合 letter_ A | B | … | Z | a | b | … | z | _ digit 0 | 1 | … | 9 id letter_ ( letter_ | digit)*
2012-8-15 编译原理 11
3.1.4 词法错误
词法分析器对源程序采取非常局部的观点 难以发现下面的错误 fi (a == f (x) ) … 在实数是a.b格式下,可以发现下面的错误 123. 紧急方式的错误恢复 错误修补
2012-8-15
编译原理
12
3.2 词法记号的描述
8
记号的例子
词法记号 const for relation id num literal 符
2012-8-15
词法单元例举 const for <,<=,=,… sum, count, D5 3.1, 10, 2.8E12 “seg. error”
模式的非形式描述 const for < 或 <= 或 = 或 … 由字母开头的字母数字串 任何数值常数 引号“和”之间的任意字
2012-8-15
编译原理
20
语言运算的例子
L = { A, B, …, Z, a, b, …, z },D = { 0, 1, …, 9 } L D is the set of letters and digits; LD is the set of strings consisting of a letter followed by a digit; L4 is the set of all 4-letter strings L* = { All possible strings of L plus } L (L D )* is the set of all strings of letters and digits beginning with a letter. D+ is the set of all strings of one or more digits.
词法记号(token):源语言文法的终结符,用 <token name, token value>表示。 模式(pattern):源语言中特定记号的构成规则, 可以用正则表达式示。 词法单元(词素,lexeme):源程序中和记号的模式 相匹配的字符串。
第三章 词法分析
2012-8-15
1
本章内容
词法分析器:将源程序的字符流翻译成记号流,以 及用户接口等任务 构造词法分析器 手工 自动生成 重点 正则表达式 有限状态自动机 自动生成工具:Lex/Flex
2012-8-15 编译原理 2
3.1 词法分析器的作用
记号 源程序 词法分析器 语法分析器
2012-8-15
编译原理
10
3.1.3 词法记号的属性
用二元组<记号,属性值>表示;属性一般用符号表的指针来 表示 例如,position := initial + rate * 60 id,指向符号表中position条目的指针 assign _ op, id,指向符号表中initial条目的指针 add_op,+ id,指向符号表中rate条目的指针 mul_ op, * num,整数值60
2012-8-15 编译原理 15
语言(Language)
语言(Language):某个给定字母表上一个任意可数 的字符串集合。 Special Languages: and {}
2012-8-15
编译原理
16
语言的例子
Alphabet {0,1} Languages {1,10,100,1000,100000…} {0,1,00,11,000,111,…} {a,b,c} {abc,aabbcc,aaabbbccc,…} {A, … ,Z} {TEE,FORE,BALL,…} {FOR,WHILE,GOTO,…} {A,…,Z,a,…,z,0,…9, { All legal C programs} +,-,…,<,>,…} { All grammatically correct English sentences }
2012-8-15 编译原理 21
3.2.3 正则表达式
例如,C语言的标识符集可以定义为: letter_ (letter_ | digit )* 正则式(Regular Expression)用来表示简单的语言, 叫做正则集
2012-8-15
编译原理
22
定义字母表上的正则表达式的规则
p r e c e d e n c e
(a) (r) | (s) is a regular expression L(r) L(s) (b) (r)(s) is a regular expression L(r) L(s)
(c) (r)* is a regular expression (L(r))*
DEFINITION
L M = { s | s is in L or s is in M} LM = { st | s is in L and t is in M}
concatenation of L and M Kleene closure of L positive closure of L
2012-8-15
编译原理
14
字符串例子及术语
Suppose: S is the string banana
Prefix : ban, banana Suffix : ana, banana
子串(Substring) : nan, ban, ana, banana
子序列(Subsequence): bnan, nn Proper prefix Proper suffix Propersubstring
2012-8-15 编译原理
备注
a r和s是正则式 r和s是正则式 r是正则式 r是正则式
24
正则表达式的例子( = {a, b})
RE RL a|b {a, b} (a | b) (a | b ) {aa, ab, ba, bb} aa | ab | ba | bb {aa, ab, ba, bb} a* 由0个或多个a构成的所有字符串集合 (a | b)* 由a和b构成的所有字符串集合 …… a | a*b 复杂的例子 ( 00 | 11 | ( (01 | 10) (00 | 11) (01 | 10) ) ) 偶数个0和偶数个1组成的01字符串
2012-8-15 编译原理 17
串的运算
连接 xy s = s = s 乘积(指数) 定义s0为,si为si-1s(i > 0) s1=s, s2=ss, s3=sss,…
2012-8-15
编译原理
18
3.2.2 语言上的运算
OPERATION
union of L and M
1. is a regular expression denoting { }
2. If a is in , a is a regular expression that denotes {a} 3. Let r and s be regular expressions with languages L(r) and L(s). Then
DESCRIPTION | is commutative | is associative concatenation is associative concatenation distributes over | is the identity element for concatenation relation between * and * is idempotent
正则表达式是模式的重要表示方法。
2012-8-15
编译原理
13
3.2.1 串和语言
字母表:有限符号的集合,例: = {0,1} 字符串:符号的有穷序列,例:0110, 字符串s的长度:出现在s中符号的个数,记作|s| 空串:长度为0的符号串,用表示 语言:给定字母表上的任意一个字符串集合 {,0,00,000,…}, {}, 句子:属于语言的字符串
(d) (r) is a regular expression L(r)
编译原理 23
All are Left-Associative. 2012-8-15
正则式 定义的语言 {} a {a} (r) | (s) L(r)∪L(s) (r)(s) L(r)L(s) (r)* (L(r))* (r) L(r) ((a) (b)*)| (c)可以写成ab*| c
2012-8-15
编译原理
7
example
C statement: printf(“total=%d”, score) <id, printf> <(, > <literal, “total=%d”> <,, > <id, score> <), >
2012-8-15
编译原理
取下一个记号 符号表
2012-8-15
编译原理
3
Lexical rules Genertor
(eg. Lex or Flex)
Stream of characters
scanner
Stream of tokens
2012-8-15
编译原理
4
词法分析器的主要任务
读入输入字符,产生token序列,交给语法分析使 用; 相关辅助任务 过滤注释、空格等; 为了报错,记录每个token在源文件中的位置
2012-8-15
编译原理
5
3.1.1 词法分析中的问题
Simplicity of design is the most important consideration. Compiler efficiency is improved. Compiler portability is enhanced.
2012-8-15 编译原理 28
正则定义的例子1
C语言的标识符集合 letter_ A | B | … | Z | a | b | … | z | _ digit 0 | 1 | … | 9 id letter_ ( letter_ | digit)*
2012-8-15 编译原理 11
3.1.4 词法错误
词法分析器对源程序采取非常局部的观点 难以发现下面的错误 fi (a == f (x) ) … 在实数是a.b格式下,可以发现下面的错误 123. 紧急方式的错误恢复 错误修补
2012-8-15
编译原理
12
3.2 词法记号的描述
8
记号的例子
词法记号 const for relation id num literal 符
2012-8-15
词法单元例举 const for <,<=,=,… sum, count, D5 3.1, 10, 2.8E12 “seg. error”
模式的非形式描述 const for < 或 <= 或 = 或 … 由字母开头的字母数字串 任何数值常数 引号“和”之间的任意字
2012-8-15
编译原理
20
语言运算的例子
L = { A, B, …, Z, a, b, …, z },D = { 0, 1, …, 9 } L D is the set of letters and digits; LD is the set of strings consisting of a letter followed by a digit; L4 is the set of all 4-letter strings L* = { All possible strings of L plus } L (L D )* is the set of all strings of letters and digits beginning with a letter. D+ is the set of all strings of one or more digits.