编译原理第三章 词法分析
合集下载
北航编译原理课件 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
‘*’ : ‘,’ : ‘(’ : ‘)’ : ‘:’ :
编译原理词法分析及词法分析程序

∴M能识别出L(G)中的全部句子。
状态图=>右线性文法
文法G[0] 0->a1
d 0
S->aA A->dA A->b
a c
1 2
b
d
3
1->d1 1->b
0->c
0->c2 2->d
S->c
S->cB,2有出弧 B->d
左线性文法=>状态转换图
设G=(VN,VT,P,S)是一左线性文法,令|VN|=K, 1) 则所要构造的状态转换图共有K+1个状态. 2) VN中的每个符号分别表示K个状态 2.1) G的开始符S为终止状态 3) 起始状态,用R(VN)标记
识别符号串与归约
S
从初态R到下一状态A对应Ba,即终结 符a归约成非终结符B; U 从状态B转换到状态A对应ABa,即将 Ba归约为A; 状态A转换到状态S(终态)对应S Aa,即 U 将Aa归约为开始符S. 归约成功,恰好进入终态,即状态转换图识 U 别了(或接受)该符号串. 识别00011的例子的归约过程
f是转换函数,是在K×Σ →K上的映像,即:如果f(ki,a)=kj, (ki,kj∈K)意味着,当前状态为ki,输入字符为a时,将转换 为下一个状态kj,我们把kj称作ki的一个后继状态;
1.确定的有限自动机
通常把这五要素组成的五元式M=(K,∑,f, S0,Z)称为确定的 有限自动机(DFA),它是相应的状态转化图的一种形式描 述,或者说,是状态转换矩阵的另一种表示。 在状态转换的每一步,据DFA当前所处状态及扫视的输入 字符,能唯一确定下一状态。
例:文法G=({S,U},{0,1},{SS1 |U1,
状态图=>右线性文法
文法G[0] 0->a1
d 0
S->aA A->dA A->b
a c
1 2
b
d
3
1->d1 1->b
0->c
0->c2 2->d
S->c
S->cB,2有出弧 B->d
左线性文法=>状态转换图
设G=(VN,VT,P,S)是一左线性文法,令|VN|=K, 1) 则所要构造的状态转换图共有K+1个状态. 2) VN中的每个符号分别表示K个状态 2.1) G的开始符S为终止状态 3) 起始状态,用R(VN)标记
识别符号串与归约
S
从初态R到下一状态A对应Ba,即终结 符a归约成非终结符B; U 从状态B转换到状态A对应ABa,即将 Ba归约为A; 状态A转换到状态S(终态)对应S Aa,即 U 将Aa归约为开始符S. 归约成功,恰好进入终态,即状态转换图识 U 别了(或接受)该符号串. 识别00011的例子的归约过程
f是转换函数,是在K×Σ →K上的映像,即:如果f(ki,a)=kj, (ki,kj∈K)意味着,当前状态为ki,输入字符为a时,将转换 为下一个状态kj,我们把kj称作ki的一个后继状态;
1.确定的有限自动机
通常把这五要素组成的五元式M=(K,∑,f, S0,Z)称为确定的 有限自动机(DFA),它是相应的状态转化图的一种形式描 述,或者说,是状态转换矩阵的另一种表示。 在状态转换的每一步,据DFA当前所处状态及扫视的输入 字符,能唯一确定下一状态。
例:文法G=({S,U},{0,1},{SS1 |U1,
编译原理词法分析

❖ 数字:继续读,直到非数字字符出现或文件尾。输 出无符号整数的单词记号及数字串;
❖ =、<、>、!:读下一个字符,判断是否为双字 符分界符,若是,组成双字符分界符,输出类码; 若不是,输出单分界符记号;
编译原理
❖ 非=、<、>、/等与双分界符首字符不同的单分界 字符:输出相应单词记号及单分界符。
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 输出单分符/
注释处理
读字符
《编译原理》教学课件 第3章-词法分析

主要内容: • 基本概念 • 正则表达式定义及一些性质 • 正则定义 • 扩充的正则表达式及程序设计语言中
单词的定义 • 正则表达式的局限性。
正则表达式
• 基本概念: • 字母表:非空有限集,,其元素称为符号或字母. • 符号串:符号的有限序列,也称为‘字’。或表示
空串 空串集{}不同于空集 。
• 符号串长度:符号串中字符的个数.|| • 符号串连接:和都是符号串,则为符号串的连接
非确定有限自动机NFA
• 定义1:一个非确定有限自动机(NFA)A是 一个五元组A=(,SS,S0,f,TS).其中
• 是字母表
• SS是状态集
• S0是初始状态集 • f是转换函数,但不要求是单值的
•
f: SS (∪{}) 2SS
• TS是终止状态集
非确定有限自动机NFA
• 定义2:设A是一个NFA,A= (,SS,S0,f,TS) • 则定义L(A)为从任意初始状态到任意终止状
❖ 空格符和制表符以及换行符的处理 1.无用的空格符和制表符要删掉; 2.字符串内的空格不能删; 3.换行符不能删。用于错误定位
❖ 复合型特殊符,如“:=”的处理 读到“:”时不能判断是否为冒号,必须读下 一字符。
❖ 括号类配对预检
• 括号类: begin …end ,if … then,[ ],{ },( )
描述程序设计语言中的单词字,进一步为词法 分析程序的自动构造寻找特殊的方法和工具。 主要内容: • 确定有限自动机DFA • 确定有限自动机DFA的实现 • 非确定有限自动机NFA • NFA到DFA的转换 • DFA的化简
确定有限自动机DFA
• 确定有限自动机(DFA:Deterministric Finite Automata ) 为一个五元组
单词的定义 • 正则表达式的局限性。
正则表达式
• 基本概念: • 字母表:非空有限集,,其元素称为符号或字母. • 符号串:符号的有限序列,也称为‘字’。或表示
空串 空串集{}不同于空集 。
• 符号串长度:符号串中字符的个数.|| • 符号串连接:和都是符号串,则为符号串的连接
非确定有限自动机NFA
• 定义1:一个非确定有限自动机(NFA)A是 一个五元组A=(,SS,S0,f,TS).其中
• 是字母表
• SS是状态集
• S0是初始状态集 • f是转换函数,但不要求是单值的
•
f: SS (∪{}) 2SS
• TS是终止状态集
非确定有限自动机NFA
• 定义2:设A是一个NFA,A= (,SS,S0,f,TS) • 则定义L(A)为从任意初始状态到任意终止状
❖ 空格符和制表符以及换行符的处理 1.无用的空格符和制表符要删掉; 2.字符串内的空格不能删; 3.换行符不能删。用于错误定位
❖ 复合型特殊符,如“:=”的处理 读到“:”时不能判断是否为冒号,必须读下 一字符。
❖ 括号类配对预检
• 括号类: begin …end ,if … then,[ ],{ },( )
描述程序设计语言中的单词字,进一步为词法 分析程序的自动构造寻找特殊的方法和工具。 主要内容: • 确定有限自动机DFA • 确定有限自动机DFA的实现 • 非确定有限自动机NFA • NFA到DFA的转换 • DFA的化简
确定有限自动机DFA
• 确定有限自动机(DFA:Deterministric Finite Automata ) 为一个五元组
词法分析-编译原理-03-(二)

5. 5.1 5.2 5.3 5.4 5.5 5.6 5.7 6 6.1 6.2
isalpha(ch) : ch→buf; 下一字符→ch WHILE isalpha(ch) OR isdigit(ch) DO ch→buf; 下一字符→ch 回送 ch; key = isKeyword(buf) IF key >= 0 THEN 返回 key Lookup( buf ) → attr 返回 IDN ':' : 下一字符→ch; IF ch等于'=' THEN 返回 ASG 出错处理
第三章 词法分析 3.1 词法分析的任务
输入源程序,输出单词符号
把构成源程序的字符串转换成语义
上关联的单词符号的序列
单词符号
token
按照最小的语义单位设计, 通常表示为二元组
(单词种别,属性值)
1) 单词符号的表示
单词种别
通常按照语法分析的需要设置. 常用: 各关键字,标识符,常数,各
例3-3 状态图的实现算法
1. 2. 3.1 3. 4. 4.1 4.2 4.3 4.4 4.5 读入当前字符 ch //跳过空格 WHILE ch 是空格 DO 下一字符 → ch CASE ch OF isdigit(ch) : ch→buf; 下一字符→ch WHILE isdigit(ch) DO ch→buf; 下一字符→ch 回送 ch 将缓冲区的数字字符串变成数字→attr 返回 NUM
7 8 9 10 11 12 13 14 15 16 17 18
'+' : 返回 ADD '-' : 返回 SUB '*' : 返回 MUL '/' : 返回 DIV '=' : 返回 EQ '>' : 返回 GT '<' : 返回 LT '(' : 返回 LP ')' : 返回 RP ';' : 返回 SEMI 其它 : 出错处理 END OF CASE
编译原理 第3章 词法分析与有穷自动机(第5-8讲)

它所对应的状态表如图:
状态 0 1 2 3 a 1 3 1 3 后继 状态 b 2 2 3 3
输入字符 接受 否 否 否 是
式的转化
22
第3章 词法分析与有穷自动机
■DFA所识别的语言
给定DFA M,对于字符c1,c2,…,cn,当以下条件成立时, 称M接受由c1,c2,…,cn组成的字符串c1c2…cn: 存在状态序列s0,s1,s2,…,sn,使得s1=f(S,c1), s2=f(s1,c2),…,sn=f(sn-1,cn),且sn∈Z。 由DFA M接受的语言L(M)是所有M接受的字符串组成的集 合。
25
第3章 词法分析与有穷自动机
判断下图是DFA还是NFA的状态转换图,并 写出其他2种表示形式
26
第3章 词法分析与有穷自动机
■由正规表达式R构造NFA
1.基本正规表达式 (a)对于正规式φ,所构造NFA: (b)对于正规式ε,所构造NFA: (c)对于正规式a,a∈Σ,则 NFA:
x ε y
练习:若S=a|bb,则L((a|bb)*)=?
5
第3章 词法分析与有穷自动机
■正规式中运算的优先级
括号优先,* 次之,•(连接)再次之,| 最后 例:a|bc* ≌ a|(b(c*)) ab|c*d ≌ (ab)|((c*)d)
■ 正规式与正规集举例
L(a|bc*)=L(a)∪L(bc*) 思考:L(ab|c*d)=? =L(a)∪L(b)L(c*) =L(a)∪L(b)(L(c))* ={a}∪{b}{ε,c,cc,ccc……} ={a,b,bc,bcc,bccc,……}
17
第3章 词法分析与有穷自动机
■有穷自动机的状态转移图表示方法
编译原理第三版 第三章 词法分析

超前搜索
例: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。 另一种编码方案(如本教材中): 标识符:列为一种,用一个整数编码表示; 常数:按类型分种编码; 关键字、运算符、界符:采用一字一种编码。
编译原理-词法分析

单词:标识符,保留字,常数,算符,界符 词法分析阶段的工作所依循的是语言的词法规
则。描述词法规则的有效工具是正规式和有限 自动机。
2
3.1 对词法分析器的要求
3.1.1 词法分析器的功能和输出形式
输入源程序,扫描识别, 输出单词符号 程序语言的单词符号一般分为五种:
关 键 字 ( 保 留 字 或 基 本 字 ) : 如 begin,end,if,then,else,while,do等
正规式
正规集
1. ba*
Σ上所有以b为首后跟着
任意多个a的字。
2. a(a|b)*
Σ上所有以a为首的字。
3. (a|b)*(aa|bb)(a|b)* Σ上所有含有两
个相继的a或两个相继的b 的字。
28
正规式与正规集: 例3.2
例3.2: 令Σ={A,B,0,1} , 则:
正规式
正规集
1. (A|B)(A|B|0|1)* 体
字母或数字 0 字母 1 其他 2 *
16
状态转换图识别字符串: 例
识别标识符的状态转换图。其中0为初态,2 为终态。
状态2是终态,它意味着到此已经识别出一个 标识符。终态上打个*号,表示多读进了一个 不属于标识符部分的字符,应把它退还给输入 串。如果在状态0时输入字符不为“字母”, 则意味着这个转换图不工作。
24
正规式定义
正规表达式
正规表达式对应的正规集
1. ,
{},
2. a
{a}
3. 若 r, s
L( r ) , L(s)
则 选择 rs
L( r ) L(s)
连接 r ∙ s
L( r ) ∙ L(s)
闭包 r *
则。描述词法规则的有效工具是正规式和有限 自动机。
2
3.1 对词法分析器的要求
3.1.1 词法分析器的功能和输出形式
输入源程序,扫描识别, 输出单词符号 程序语言的单词符号一般分为五种:
关 键 字 ( 保 留 字 或 基 本 字 ) : 如 begin,end,if,then,else,while,do等
正规式
正规集
1. ba*
Σ上所有以b为首后跟着
任意多个a的字。
2. a(a|b)*
Σ上所有以a为首的字。
3. (a|b)*(aa|bb)(a|b)* Σ上所有含有两
个相继的a或两个相继的b 的字。
28
正规式与正规集: 例3.2
例3.2: 令Σ={A,B,0,1} , 则:
正规式
正规集
1. (A|B)(A|B|0|1)* 体
字母或数字 0 字母 1 其他 2 *
16
状态转换图识别字符串: 例
识别标识符的状态转换图。其中0为初态,2 为终态。
状态2是终态,它意味着到此已经识别出一个 标识符。终态上打个*号,表示多读进了一个 不属于标识符部分的字符,应把它退还给输入 串。如果在状态0时输入字符不为“字母”, 则意味着这个转换图不工作。
24
正规式定义
正规表达式
正规表达式对应的正规集
1. ,
{},
2. a
{a}
3. 若 r, s
L( r ) , L(s)
则 选择 rs
L( r ) L(s)
连接 r ∙ s
L( r ) ∙ L(s)
闭包 r *
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
起点指示器 搜索指示器 起点指示器 搜索指示器 起点指示器
120个字符
输入缓冲区 输入缓冲区
两 个 互 补 输 入 缓 冲 区
单词符号识别的简单方法:超前搜索。 关键字识别: 例如:在标准FORTRAN中 1、DO99K = 1,10 2、IF(5.EQ.M)I = 10 3、DO99K = 1.10 4、IF(5) = 55
state 0: C := GETCHAR ;
if LETTER(C) then goto state 1
else FAIL( )
字母或数字 字母 其他
0
1
2
*
DIGIT( )是布尔函 只要碰到标识符后的分 数过程,当且仅当 界符,它返回 TRUE。 C中的字符是数字, 分界符一般为:空格、 它返回真假值 算术、逻辑符号,括号、 TRUE。 ‘=’、‘;’、‘.’ 、 ‘,’。
字母或数字 字母 其他
0
1
2
*
INSTALL( )是过程, RESERVE( ) 整型函数 如我们识别出的标 如果同时识别 过程 ,针对TOKEN中的 RETRACT( )是过程, 识符不在符号表中, 字符串进行查找,看其 标识符和定义符, 由于分界符不属于 我们把它装入符号 是否是保留字,是保留 则需要修改为 标识符,所以我们 字给出它的编码,否则 表。我们还要给语 State2 : 要把先行指针回调 回送 0(假定 0不是保留 法分析程序返回一 字编码)。 一个字符。 个二元式。
.56E-7
数字
数字
数字
0
数字 ·
1
· 数字
2
E 或 D
3
+或-
4 数字
数字
5
其他
7
*
6
其他
图2.2 状态转换图
一般,我们可以让每一个状态结对应一个程序段。 例如:我们可以让不含回路的分叉结,对应一个CASE 语句,或者是一组IF„THEN„ELSE语句。具体见后面实例。 终态结一般对应一个RETURN(C,VAL)语句。其中C为单词 种别编码;VAL是字符数组的TOKEN ,或者是一个整数值, 或者无定义。具体见后面实例。
转换图:是一张有限方向图。在状态转换图中,结点代表 状态,用圆圈表示。状态之间用箭弧连接。箭弧上 的标记(字符)代表在射出结状态下可能出现的输 入字符或字符类。 状态转换图的功能:用于识别一定的字符串。 初态:一张转换图的启动条件,至少有一个,用圆圈表示。 终态:一张转换图的结束条件,至少有一个,用双圈表示。 * :表示多读进了一个字符。
例:下述C++代码段:while ( i &词符号串
( while ,_ ) ( ( ,_ ) ( id ,指向i的符号表指针 ) ( >= ,_ )
( id ,指向j的符号表指针 )
( ) ,_ ) ( id ,指向i的符号表指针 )
5、界符:如逗号、分号、括号、/*,*/ 等。它是确定的。
单词符号的表示形式:词法分析器所输出的单词符号常常表示成
二元式(单词种别,单词自身的值)。 单词种别可以用以下形式表示: 1、一类单词统一用一个整数值代表其属性。例如:1代表关键字, 2代表标识符等。 2、每一个单词一个类别。例如:1代表BEGIN,2代表END等。 单词自身的值可以表示成:常量的二进制表示;常量、变量等在符号表 种的地址码,等等。
例2-7:示例——如何把状态结对应于一段程序:
字母或数字 字母 其他
0
1
2
*
FAIL( )是例子程序, LETTER( )是布尔 它移回先行指针 函数过程,当且仅 (lookahead 当C中的字符是字 pointer ), 开始下一 母,它返回真假值 状态转换图,或调用 TRUE。 出错程序。
对于如上的状态转换图,状态0的代码如下所示:
修改之后,状态 2的代码如下所示: 对于如上的状态转换图,终态——状态 2 的代码如下所示: state 2: RETRACT( ) ;
state 2: RETRACT( ) ; ); c := RESERVE( RETURN($id if c = 0 ,INSTALL( ) ) then else
的。 常数的类型一般有整型、实型、 布尔型、文字型等。它是不限 的。 运算符:如+、-、*、/ 等。 它是确定的。 界符:如逗号、分号、括号、 /*,*/ 等。它是确定的。
1、关键字
源 程 序
2、标识符
扫描器
3、常数
scanner
4、运算符
5、界符
词法分析器的功能:输入源程序,输出单词符号。 单词符号:一个程序语言的基本语法符号。分为以下5种。
例:151-FORTRAN编译程序的词法分析器在扫描输入串 IF (5·EQ·M) GOTO 100
逻辑IF 左括号 整常数 等号 标识符 右括号 GOTO 标号 (34,_)
后,它输出的单词符号串是:
IF为关键字,种别编码34, 采用一符一种的编码方式。 ‘(’为界符,种别编码 2,采 (2 ,_ ) 用一符一种的编码方式。 常数类型,种别编码20,单词自 (20,‘5’的二进制表示) 身的值为‘5’的二进制表示。 等号为运算符,种别编码6, (6 ,_ ) 采用一符一种的编码方式。 M为标识符,种别编码26,单 (26,‘M’) 词自身值为‘M’。 ‘)’为界符,种别编码16, (16,_) 采用一符一种的编码方式。 GOTO为关键字,种别编码30, (30,_) 采用一符一种的编码方式。 100为标号,种别编码19,单词 (19,‘100’的二进制表示) 内部的值用100的二进制表示。
例2-6:以下CASE语句段对应的状态图:
state i: GETCHAR; CASE CHAR OF ‘A’..‘Z’:„ state ‘0’..‘9’:„ state ‘/’ END; FAIL :„ state j „ ; k „ ; l „ ;
过程,将下一输入字 符读入CHAR,搜索指 示器前移一个字符。
其中的DO、 IF为关键字 其中的DO、 IF为标识符 的一部分
标识符的识别
多数语言的标识符是字母开头的“字母/数字”串, 而且在程序中标识符的出现后都跟着算符或界符。因此, 不难识别。 常数的识别 对于某些语言的常数的识别也需要使用超前搜索。
算符和界符的识别
对于诸如C++语言中的“+ +”、“- -”,这种复 合成的算符,需要超前搜索。
确定
1、关键字:由程序语言定义的具有固定意义的标识符。也 可称为保留字或基本字。例如:Pascal中的begin, end,if等。它是确定的。 2、标识符:用来表示各种名字,如变量名、数组名、过程 名等。它是不限的。
3、常数:常数的类型一般有整型、实型、布尔型、文字型 等。它是不限的。
不限
4、运算符:如+、-、*、/ 等。它是确定的。
( - - ,_ )
( ; ,_ )
1、把词法分析从语法分析中脱离出来的优点: 外存 •使编译程序的结构更加简洁、清晰和条理化。
•词法分析和语法分析方法不同,词法分析可以使用正则文法自动构造 单 源 scanner简单。 词
程 符 语法 序 •有利于提高语法分析的效率。 号
分析 •可以改善词法分析的细节,甚至于一个语法分析配几个 scanner,把不同 的输入变成一种内部表示。 2、把词法分析作为独立的一遍 scanner 语法分析 scanner作为子程序
•scanner当作一遍。 •把scanner当作子程序。
scanner
源程序
scanner作为一遍
设计前提:
输入
预处理 • 词法分析器的任务为输出单词符号。 子程序 扫描缓冲区
•
列表 把scanner 作为一个独立的子程序; 输入缓冲区
预 处 理 部 分
•必要性:编辑性字符如空白符、回车符等,除了出现在文字和 扫描器 常数中以外,在别处出现都没有意义。 扫 单词符号 描 •功 能: 剔除无用字符。 器 语法分析器 •实 现: 预处理子程序。 图2.1 词法分析器
词法分析的任务:
从左至右逐个字符地扫描源程序,产生 一个个的单词符号,把作为字符串的源程序 改造成为单词符号串的中间程序。
词法分析器/扫描器:执行词法分析的程序。
词法分析器的功能如下图所示:
由程序语言定义的具有固定意 义的标识符。也可称为保留字 或基本字。例如: Pascal中的 用来表示各种名字,如变量名、 begin ,end,if等。 数组名、过程名等。它是不限
字母 数字
j
k
i
/
l
字符变量,存放最新 读进的源程序字符。
GETCHAR是过程,
将下一输入字符读入 为了把状态转换图转化成程序,每个状态要建立一段
程序,它要做的工作如下:
CHAR,搜索指示器 前移一个字符。
第一步:从输入缓冲区中取一个字符。为此,我们使用函 数GETCHAR,每次调用它,推进先行指针,送回一 个字符。 第二步:确定在本状态下,哪一条箭弧是用刚刚来的输入 字符标识的。如果找到,控制就转到该弧所指向 的状态;若找不到,那么寻找该单词的企图就失 败了。 失 败:先行指针必须重新回到开始指针处,并用另一状 态图来搜索另一单词。如果所有的状态转换图都 试过之后,还没有匹配的,就表明这是一个词法 错误,此时,调用错误校正程序。
例:简单的状态转换图示例:
1
X
2
初态
终态
Y
(a)转换图示例 数字
3
从0状态到1状态 可能出现字母
字母或数字 字母 其他
0
1
2
*
0
数字
1
其他
2 *
(b)识别标识符的转换图
(c)识别整数的转换图
例:识别FORTRAN实型常数的转换图: