编译原理 3.2正规文法和状态转换图
《编译原理》第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}
编译原理词法分析及词法分析程序

状态图=>右线性文法
文法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,
编译原理第三章_有穷自动机

例 过河问题 分析(续)
初始状态:MWGC-φ;终止状态:φ-MWGC。 g
MWGC-φ
WC-MG
问题:
6
例 过河问题 状态转换图
起始 g
MWGC-φ g
g φ-MWGC
g
7
WC-MG
m
m MWC-G
w
w
c
C-MWG
c W-MGC
g
g
MGC-W c
MG-WC
w
m
c G-MWC
m
gg MWG-C
+dd. ddd;
输入符号串
数字 数字
SB
.
数字
+
A
H
-.
数字
.G
接收:若扫描完输入串, 且在一个终止状态上结 束。
数字 阻塞:若扫描结束但未 停止在终止状态上;或 者为能扫描完输入串 (如遇不合法符号)。
不完全描述:某些状态 对于某些输入符号不存 在转换。
练习:+34.567 .123 3.4.5
w
有穷自动机(FA)
数字系统:可以从一个状态移动到另一个状态;每次 状态转换,都上由当前状态及一组输入符号确定的;可以 输出某些离散的值集。
FA:一个状态集合;状态间的转换规则;通过读头来 扫描的一个输入符号串。
读头:从左到右扫描符号串。移动(扫描)是由状态 转换规则来决定的。
8
读头
一个FA的例子
(3)运行: 串f(,Q,且t1tt21)∈= Σf(,f(Qt1,t2t1∈), Σt2*),其中Q∈K, t1t2为输入字符
17
例3
题:试证abba可为例1的DFA M所识别(所接受)。
词法分析-编译原理-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.2正规文法和状态转换图

2020/6/18
B=
状态 vt S1 S2 … Si … Sn
a1 a2 a3 … aj … am
B23 Bij
第25页/共24页
其中,元素 Bij=B[Si,aj] 指明下一状态 Sk 和 扫描器此时应完成的语义动作;
助记符
while if else
switch case id num
+ − * relop relop relop = ;
内码值
— — — — —
id在符号表中位置
num在常数表中位置
—
—
— LE LT EQ — —
第33页/共24页
2 C语言子集对应的状态转换图的设计 首先对输入串做预处理。
即剔除多余的空格、注释、制表符和 换行符等。
由于直接使用整数编码不利于记忆, 故采用一些助记符表示种别编码。
2020/6/18
第32页/共24页
表1 C语言子集的单词符号及内码值
单词符号
while if else
switch case 标识符 常数
+ − * <= < == = ;
2020/6/18
种别编码
1 2 3 4 5 6 7 8 9 10 11 11 11 12 13
(2)状态4识别出一个常数后可以将它 转换成二进制常数再登录到常数表,然后返 回它在常数表中的入口指针作为内码值。
2020/6/18
第37页/共24页
3 状态转换图的实现 状态转换图易于用程序实现,最简单的
办法是让每个状态对应一小段程序。对于 图3–00,首先引进一组变量和过程:
chapter3.2正规文法和状态转换图

右=>状 讨论1:消除ε产生式的方法-2
如文法G[S]:
S -> A A -> aX X -> ε 消除ε后,G[S]为 S -> A A -> a 而不是: S -> A A -> aX | a (显然A无法产生终止符串)
右=>状 讨论2 A-other->[[F]] vs [[A]]
A
[other]
L(G) c, cd, ad b | n 0
n
3.2.1(1)右线性文法=>状态转换图
设G=(VN,VT,P,S)是一右线性文法,令|VN|=K, 1) 则所要构造的状态转换图共有K+1个状态. 2) VN中的每个符号分别表示K个状态 2.1) G的开始符S为初态状态
3) 终止状态,用F(VN)标记
1
{return ( ICON= w ); {n++; w=w*10+d;} {return (FCON =w*pow(10,e*p-n) ) ;} {n++;w=w*10+d;} error {p=p*10+d;} e=-1; error {p=p*10+d;} error {p=p*10+d;} {return (FCON=w*pow(10,e*p-n) );
3) 起始状态,用R(VN)标记
R是新加(状态)节点
左线性文法=>状态转换图 转换规则 A -> Ba B R
a
a
A A
A -> a
若A为起始符(G[A])
A
消除ε,重用上述规则
A ->ε
不存在这 种转换
编译原理第3章

1、说明:
• 有限自动机是具有离散输入输出系统的数学模型。它具 有有限数目的内部状态,系统可以根据当前所处的状态 和面临的输入字符决定系统的后继行为。其当前状态概 括了过去输入处理的信息
输入带
a b
c d
读头
e ……
有限状态控制器
2014-5-22 12
3.1 正规文法与有限自动机
• 二、有限自动机
电梯是典型的有限状态自动机 那电梯如何描述呢? 电梯的程序又如何构造呢?
2014-5-22
13
3.1 正规文法与有限自动机
• 二、有限自动机-分别讲解
2、确定有限自动机(DFA)
• 确定有限自动机DFA是一个五元组 M(S,,f,s0,Z),其中:
• 1. 取I0=S0 • 2. 若状态集Q中有状态Ii={s0,s1,……sj} , sk∈S , 0 kj;而 且M机中有f({s0,s1,……sj},a)= f(s0,a)∪f(s1,a)…∪f(sj,a) ={s0,s1,……st} =It,若It不在Q中,则将It加入Q。 • 3. 重复第(2)步,直至Q中没有新的状态加入 • 4.取终态F={I | I ∈ Q,且I ∩ Z }
例:已知正规文法G1的产生式,求出它所定义的正规式。
产生式为:SaS|aB BbB|bA AcA|c
• 解:由产生式写出对应的联立方程组: S=aS|aB ( 1) B=bB|bA ( 2) A=cA|c ( 3) 运用定理2求解(1)(2)(3): …
2014-5-22
11
3.1 正规文法与有限自动机
• 注意:
– 仅由字母表A={ai| i=1,2,……n}上的正规式所组成的语言 称作正规集,记作L() – 利用正规集相同,可用来证明相应正规式等价 – “|”读作为“或”,也可写作为“+”或“,”;“•”读作 连接
编译原理 第3章习题解答

第三章习题参考解答3.1 构造自动机A,使得①②③当从左至右读入二进制数时,它能识别出读入的奇数;④它识别字母表{a, b}上的符号串,但符号串不能含两个相邻的a,也不含两个相邻的b;⑤它能接受字母表{0, 1}上的符号串,这些符号串由任意的1、0和随后的任意的11、00对组成。
⑥它能识别形式如±dd*⋅ d*E ±dd的实数,其中,d∈{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}。
3.2 构造下列正规表达式的DFSA:① xy*∣yx*y∣xyx;② 00∣(01)*∣11;③ 01((10∣01)*(11∣00))*01;④ a(ab*∣ba*)*b。
3.3 消除图3.24所示自动机的空移。
bεq1q2q3aba,bqaq6q4q5abεεε图3.24 含空移的自动机3.4 将图3.25所示NDFSA确定化和最小化。
xyqq1q2q4q3xyxyx,yx图3.25 待确定化的NDFSA3.5 设e、e1、e2是字母表∑上的正规表达式,试证明① e∣e=e;② {{e}}={e};③ {e}=ε∣e{e};④ {e1 e2} e1= e1{e2 e1};⑤ {e1∣e2}={{e1}{e2}}={{e1}∣{e2}}。
3.6 构造下面文法G[Z]的自动机,指明该自动机是不是确定的,并写出它相应的语言: G[Z]:Z→A0A→A0∣Z1∣03.7 设NDFSA M=({x, y},{a, b},f, x, {y}), 其中,f(x, a)={x, y}, f(x, b)={y}, f(y, a)=∅, f(y, b)={x, y}。
试对此NDFSA确定化。
3.8 设文法G[〈单词〉]:〈单词〉→〈标识符〉∣〈无符号整数〉〈标识符〉→〈字母〉∣〈标识符〉〈字母〉∣〈标识符〉〈数字〉〈无符号整数〉→〈数字〉∣〈无符号整数〉〈数字〉〈字母〉→a∣b〈数字〉→1∣2试写出相应的有限自动机和状态图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020/6/18
第30页/共24页
一个简单的词法分析器示例
1 C语言子集的单词符号表示 2 C语言子集对应的状态转换图的设计 3 状态转换图的实现
2020/6/18
第31页/共24页
1 C语言子集的单词符号表示
大多数程序语言的单词符号都可用 状态转换图予以识别。下面构造一个C 语言子集的简单词法分析器,该C语言 子集的所有单词符号及其种别编码和内 码值如下表所示。
开始符号S作为初始状态; S 设一符号F不属于V作为终止状态; F
2020/6/18
第7页/共24页
形如A→aB的规则:从结点A引一条矢线到结
点B,并用符号a标记这条矢线;
a
A
B
形如A→a的规则:从结点A引一条矢线到终态
结点F,并用符号a标记这条矢线;
a
A
F
2020/6/18
第8页/共24页
则有:S=> a1A1=> a1 a2A2=> a1 a2 a3A3=> … => a1 a2 a3 … an-1An-1=> a1a2a3…an
事实上,在利用状态转换图M对符号串ω进行识别的 过程中,M中的每一次状态转换都模拟了G中的一步 直接推导,所以,上述方法是一个自顶向下的分析
方法。
2020/6/18
a
R
A
2020/6/18
第16页/共24页
例如:G[Z]:Z→U0∣V1 U →Z1∣1 V →Z0∣0
1
2020/6/18
1
U
初态 R
0
V
0
Z
1
0
第17页/共24页
二、状态图的使用——识别句子
对于已知的字符串ω =a1a2a3……an,利用状态 转换图识别的步骤:
从初态R开始,自左向右扫描ω的字符,在当前状态 所射出的弧中,找出标记有该字符的弧,并沿此弧 过渡到下一当前状态;
(8)buildlist( ): 将标识符登录到符号表或将常数 登录到常数表;若登录表中已存在该标识符 或常数,则返回相关信息。
(9)error( ): 进行出错处理。 (10)getchar():把下一个输入字符读到character 中,读入源程序字符的指针前移一个字符。
2020/6/18
第40页/共24页
Sk:其含义是,在Si状态下,扫描到输入符
号aj时,按序偶(Si,aj)查矩阵B,扫描
Bij=
器根据Bij的指示,先执行相应的语义动作,
再转换到下个状态Sk;
空白:“出错”,则说明输入符号串有误,
拒绝接受,扫描器将调用出错处理程序进
行处理。
2020/6/18
第26页/共24页
在一个状态矩阵中,有很多元素都是出错状态, 为了节省存放状态矩阵的存储空间,在具体实现 时,常采用更为紧凑和有效的数据结构(见P55 表3-1 )。
一、状态图
文法中的每一个非终结符号代表一结点 (状态) ;
开始符号S作为终止状态 S 设一符号R不属于V作为初始状态 R
2020/6/18
第15页/共24页
形如A→Ba的规则:从结点B引一条矢线到 结点A,并用符号a标记这条矢线;
a
B
A
形如A→a的规则:从初始状态R引一条矢 线到结点A,并用符号a标记这条矢线;
助记符
while if else
switch case id num
+ − * relop relop relop = ;
内码值
— — — — —
id在符号表中位置
num在常数表中位置
—
—
— LE LT EQ — —
第33页/共24页
2 C语言子集对应的状态转换图的设计 首先对输入串做预处理。
即剔除多余的空格、注释、制表符和 换行符等。
其它
其它
第23页/共24页
3.2.3 状态转换图的一种实现
状态矩阵法:状态转换图可方便地用于识别 单词,但是,如何让计算机利用状态转换图 来进行词法分析呢?一个简单实用的方法就 是将图以矩阵的形式保存在内存中,这就是 所谓的状态矩阵法。
2020/6/18
第24页/共24页
状态(转换)矩阵:以状态转换图中各个状态S1,
字母
其它
*
0
1
2
2020/6/18
( a)
第21页/共24页
识别无符号整数的状态转换图如下:
数字
数字 0
其它
*
1
2
(b)
2020/6/18
第22页/共24页
识别无符号数的状态转换图如下:
E
数字
数字
数字
数字 · 数字 E +或- 数字 其它
0
1
2
3
4
5
6
27
数字
另见:P51 图 3-3
2020/6/18
(5)letter( )和digit( ): 判断character中的 字
符是否为字母和数字的布尔函数,若是 则返回true, 否则返回false。 (6)reserve( ): 按token数组中的字符串查 保留字表, 若是保留字则返回其编码, 否则返回0。
2020/6/18
第39页/共24页
(7) retract( ): 扫描指针回退一个字符, 同 时将character置为空白。
第13页/共24页
从状态转换图的初态出发,分别沿着一切可能 的路径到达终态结点,并将每条路径各矢线上 的标记字符依次连接起来,便得到状态转换图 所能识别的全部符号串,这些符号串所组成的 集合也就是该状态转换图所识别的语言。
2020/6/18
第14页/共24页
3.2.2.2 左线性文法的状态转换图
其次把保留字作为一类特殊标识符处理。
即对保留字不专设对应的状态转换图, 当状态转换图识别出一个标识符时就去查 表,确定它是否为一个保留字。
2020/6/18
第34页/共24页
对保留字专设对应的状态转换图:
C语言子集对应的状态转换图如下:
2020/6/18
第35页/共24页
空白 字母或数字
开始 字母
<标识符>→<标识符>数字 <标识符>→字母
凡是能用正规文法描述的语言,均可由某种有 限状态算法进行分析;
2020/6/18
第3页/共24页
3.2.1 状态转换图
状态转换图是设计和实现扫描器的一种有效工具; 状态转换图:是一组矢线连接的有限个结点组成
的方向图
每一个结点对应在识别或分析状态中扫描器所处的状 态,用小圆圈表示;
特别的A → ε:从A引一条矢线到终态,且在这 条失线上标记未曾在A的射出弧中出现终结符号。
例如:
Vt ={a,b,c} A→aB|ε
a
B
A
b,c F
表示读到a以外的其他任何终结符号都进入终态
2020/6/18
第9页/共24页
例如:G[Z]:Z→0U∣1V U →1Z∣1 V →0Z∣0
2020/6/18
满足:识别到字符串最后一个字符,进入终态; 否则:ω不是文法的句子(单词符号);
2020/6/18
第18页/共24页
例如:
G[Z]: Z→U0∣V1 U →Z1∣1 V →Z0∣0
1U 初态 R
0V
2020/6/18
1 0
Z
1
0
ω =100110?
100110 U00110 Z0110 V110 Z10 U0 Z
构造出状态矩阵之后,整个单词的识别过程就可 在一个驱动程序(见P54 程序3-2)的控制之下自 动地进行,直到从输入字符串中识别出全部单词 为止;
2020/6/18
第27页/共24页
P55 表3-1
2020/6/18
第28页/共24页
P54 程序 3-2
2020/6/18
第29页/共24页
P54 程序 3-2
(2)状态4识别出一个常数后可以将它 转换成二进制常数再登录到常数表,然后返 回它在常数表中的入口指针作为内码值。
2020/6/18
第37页/共24页
3 状态转换图的实现 状态转换图易于用程序实现,最简单的
办法是让每个状态对应一小段程序。对于 图3–00,首先引进一组变量和过程:
(1)character: 字符变量,存放最新读入 的源程序字符。
(2)token: 字符数组,存放构成单词符号 的字符串。
(3)getbe( ): 若character中字符为空,则 调用getchar( ),直至character为非空。
2020/6/18
第38页/共24页
(4)concatenation( ): 将token中字符串与 character中字符连接作为token中的新 字符串。
返回(relop, LE) 返回(relop, LT)
返回(relop, EQ) 返回(=, -) 返回(; , -)
图 3-00
非法字符错
第36页/共24页
注意: (1)状态2识别出一个单词符号后需先
查保留字表,若匹配则为保留字,否则为标 识符。若为标识符,还需查符号表,看表中 是否有此标识符。若符号表中无此标识符, 则先将它登录到符号表中,再返回它在符号 表中入口地址作为内码值;若表中有此标识 符,则直接返回其入口地址作为内码值。
Z U0 Z1 V1 Z0 U0
1
此过程是一种归约过程
第19页/共24页
用对左线性文法所构造的状态转换图来识别 文法的句子,其过程与上面对右线性文法中 所述的过程并无二致。不过,就识别的方法 而论,它却属于自底向上的分析。