自动机、正则文法、正则表达式的相互转化.ppt
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SL(G[Z])其中G[Z]为某语言成分的文法. 若不成功,则 SL(G[Z])
我们可以通过一例子来说明语法分析过程
7
例:已知符号串S=cad 文法G[Z]:
Z→cAd
A→ab|a 求解 SL(G[Z])
分析过程 是设法建立一棵语法树, 使语法树的末端结点与
给定符号串相匹配.
1.开始:令Z为根结点
文法 E->E+T | T T->T*F | F F->(E) | i
消除左递归后: E->TE’, E’->+TE’ | ε T->FT’, T’->*F T’| ε F->(E) | i
例2 已知G[E]: E->T*F | T/F | F T->F | T*F | T/F
解:左递归改为右递归得:
1. 左递归文法:
左递归文法 回溯问题
文法G,存在U ∈Vn,if U=+=>U…, 则G为左递归文法
自顶向下分析方法的基本缺点:
不能处理具有左递归性的文法
自顶向下分析为什么不能处理左递归文法?
自顶向下分析为什么不能处理左递归文法?
在采用最左推导的自顶向下分析中,左递归的存在是十分有害 的,例如,考虑文法G[S]: SSa|b,分析输入串baaa是否为 文法的合法句子。按照自顶向下分析法,对输入串baaa的当前 输入符b从开始符号S开始进行最左推导,若首次使用SSa则 可能得到:
15
算法描述
1.把G的非终结符整理成某种顺序A1,A2,……An ,使得:
A1 ::= δ1|δ2|……δk
A2 ::= A1 r……
间接左递归
A3 ::= A2u | A1v…..
……. 一般左递归也可以通过改写法予以消除。
消 2. For i:=1 to n do
除
begin
直接左递归
所
for j :=1 to i-1 do
复 自动机、正则文法、正则表达式 习 的相互转化
1 2
NFA
正则文法4 3ຫໍສະໝຸດ 5 6正则表达式DFA
最小化
第四章 语法分析
4.1 自顶向下分析法
4.1.1 自顶向下分析的思想 4.1.2 左递归和回溯性质 4.1.3 递归子程序法(递归下降分析法) 4.1.4 LL(1)分析法
4.2 自底向上分析法
4.2.1 自底向上分析法概述 4.2.2 LR分析法的概念 4.2.3 LR(0)项目族的构造 4.2.4 SLR分析法 4.2.5 LALR分析法 4.2.6 二义性文法的应用
type simple | id | array [simple] of type simple integer | char | num dotdot num
使用类Pascal语言为非终结符type设计子程序如下: proccdure type; begin
case lookahead of in {integer, char, num}: simple( ) : begin
5.消除S的直接左递归
S→(abc|bc|c)S’
S’ →abc S’|ε
最后得到文法为:
S→(abc|bc|c)S’ Q→Sab|ab|b
S’ →abc S’|ε R→Sa|a
17
最后得到的文法:
S→(abc|bc|c)S’ S’ →abc S’|ε Q→Sab|ab|b R→Sa|a 可以看出其中关于Q和R的规则是多余的规则 ∴经过压缩后 S→(abc|bc|c)S’ S’ →abc S’|ε 可以证明改写前后的文法是等价的
R→Sa|a Q→Rb|b S→Qc|c
该文法是无直接左递归,但有间接左递归
SQc Rbc Sabc
∴ S +Sabc
1.检查规则R是否存在直接左递归 R→Sa|a
2.把R代入Q的有关选择,改写规则Q Q→Sab|ab|b
3.检查Q是否直接左递归
4.把Q代入S的右部选择
S→Sabc|abc|bc|c
E -> T*F | T/F | F
T -> FT’ T’ -> *FT’ | /FT’ | ε
14
②消除一般左递归
基本思想 先用代入法把间接左递归变成直接左递归,再消除 直接左递归,最后去掉多余规则以化简文法。
算法说明 要求文法不能含有回路(即形如P + P的推导),并且 不含作为规则的右部。
2.用Z的右部,符号串去匹配输入串
完成一步推导ZcAd 检查 c-c匹配 A是非终结符,将匹配任务交给A
Z Z·
cAd
8
S=cad G[Z]: Z→cAd A→ab|a
3. 选用A的右部符号串匹配输入串 A有两个右部,选第一个
Z·
完成进一步推导Aab 检查,a-a匹配,b-d不匹配(失败)
cAd
4
自顶向下分析算法的基本思想为:
若Z
+
S
则 S L(G[Z])
否则 S L(G[Z])
G[Z]
存在主要问题: 左递归问题 回溯问题
主要方法: • 递归子程序法 • LL分析法
自底向上分析算法的基本思想为:
若Z + S 则 S L(G[Z]) 否则 S L(G[Z])
G[Z]
SSaSaaSaaaSaaaa
如果文法具有间接左递归,则也将发生上述问题,只不过
环的圈子兜的更大。
要实行自顶向下分析,必须要消除文法的左递归,下面
我们将介绍直接左递归的消除方法,在此基础上再介
绍一般左递归的消除方法。
12
① 消除直接左递归:
将左递归规则改为右递归规则
若:P→P| 则可改写为:P → P’
应该指出,由于对非终结符的排序不同,最后得到的文法在形 式上可能是不一样的,但是不难证明它们的等价.
18
2. 回溯问题
什么是回溯?
分析工作要部分地或全部地退回去重做叫回溯
造成回溯的条件:
U::= 1 | 2 | 3
文法中,对于某个非终结符号的规则其右部 有多个选择,并根据所面临的输入符号不能准确 的确定所要选择时,就可能出现回溯。
消除回溯的途径:
改写文法
对具有多个右部的规则反复提取左因子
例 U→xV|xW
U, V, W∈Vn, x∈Vt
改写为U→x(V|W)
更清楚表示
U→xZ
Z→V|W
4.1.3 递归子程序法(递归下降分析法)
递归下降分析法也称递归子程序法,是一种直观易于构造的 自顶向下分析方法。分析过程则通过自上而下一级一级地调用 子程序来实现,所以称为递归下降分析法。 思想 为文法中每个非终结符编写一个递归过程,每个过程的功能是 识别由该非终结符推出的串,当某非终结符的产生式有多个候 选式时,按LL(1)形式唯一确定选择哪个候选式进行推导,若遇 到某候选式为,认为其自动匹配。把这些递归过程组合起来就 构成了文法的递归下降分析程序。 限制: 对文法要求高,必须满足LL(1)文法; 由于递归调用多,速度慢,占用空间多。 尽管这样,它还是许多高级语言的编译系统 经常采用的语法分析方法。
20
例子
设有文法G[S]: S->Aa|Bb A->d|cA B->b|aB
对S: FIRST(Aa)={d,c}, FIRST(Bb)={a,b}, FIRST(Aa) ∩FIRST(Bb)= φ
对A: FIRST(d)={d}, FIRST(CA)={c}, FIRST(d) ∩FIRST(Ca)= φ
回溯带来的问题:
严重的效率低,只有在理论上的意义而无实际意义
19
效率低的原因
1)语法分析要重做 2)语法处理工作要推倒重来
为避免回溯,对文法的要求是
FIRST(αi) ∩ FIRST(αj)=φ (ij) 非终结符的候选式的首符集两两不相交
[定义] 设文法G(不具左递归性) FIRST(α) = {a | α *aβ, a Vt , α,β V*} 若α * ε,则规定ε FIRST(α) 符号串α的所有可能推导出的开头终结符或ε
(2)对于形如Xi→Y1Y2…Yk(Yj∈VN∪VT)的产生式, 相应子程Pi( )是一个依次识别其右部各符号Yj (j=1,2,…,k)的过程:如果Yj∈VT,则判断当前输入 符号是否与Yj匹配;若Yj∈VN则应有调用相应于Yj的 子程序的代码。
(3)对于形如Xi→ε的产生式,在相应的子程序Pi( )中, 应该能够判断当前输入符号a是否属于集合 FOLLOW(Xi),从而决定是从Pi( )返回还是报错。
存在主要问题:
主要方法:
• 句柄的识别问题
• 算法优先分析法 • LR分析法
5
自顶向下分析
4.1.1 自顶向下分析的思想 4.1.2 自顶向下分析存在的问题及解决方法 4.1.3递归子程序法(递归下降分析法) 4.1.4 LL(1)分析法
6
4.1.1 自顶向下分析的思想
给定符号串S,若预测是某一语法成分, 那么可根据该语法成分的文法,设法为S构造一棵语法树. 若成功,则S最终被识别为某一语法成分,即
match (); match (id) end array: begin
match (array); match ( [ ); simple( ); match ( ] ); match (of ); type( ) end other error( ) end case end;
(4)在各个子程序Pi( )中,均应含有进行语法检查的 代码。
例1:下面文法产生Pascal类型的子集,我们用dotdot表 示“..”,以强调这个字符序列作为一个词法单元。 type simple | id | array [simple] of type simple integer | char | num dotdot num 显然该文法是LL(1)文法,为其构造递归下降分析器。
P’ →P’| ε
证明的关键步骤:
P->Pα | β P-> β | βα | βαα | βααα | …… P-> β (ε | α | αα | ααα | ……) P-> βP’, P’-> ε | α | αα | ααα | …… P-> βP’, P’-> ε | αP’
13
编译程序的功能和组织结构
表处理
前 端中 中后目端
源 程 序
词语语间间标 法法义代代代 分分分码码码 析析析生优生
目 标 程 序
成化成
错误处理
语法分析概述
功能:根据文法规则,从源程序单词符号串中
识别出语法成分,并进行语法检查。
基本任务:识别符号串S是否为某语法成分
两大类分析方法: 自顶向下分析
自底向上分析
对B: FIRST(b)={b}, FIRST(aB)={a}, FIRST(b) ∩FIRST(aB)= φ
若给定 w=abb
则自顶而下分析对应的推导为:
S=>Bb=>aBb=>abb
21
由此我们可以看出,如果文法中不含空符产生式,并且每个非终结符的 所有候选式右部的首符集两两不相交,则推导中就不会产生回溯。而提取左 因子正是为了达到这个目的,即反复提取左因子后,就能够把每个非终结符 (包括新引进的非终结符)的所有候选首符集变成两两不相交。因此,提取 左因子可以使得不含空符产生式的文法消除回溯。
• 递归下降分析器的设计
设文法G=(VN,VT,P,S), VN={X1,X2,…, Xn}。对G的每个非终结符号Xi,可以按照下面 方法设计子程序Pi( ):
(1)对于形如Xi→ γ1 | γ2 | …| γm 的产生式,在相应子 程序Pi( )中,应该能够判断当前输入符号a属于哪个候 选式γj 的FIRST集,并转入该候选式相应代码段,继 续识别。对候选式的选择可用if语句或case语句实现。
1.分析过程是带有预测的,对输入符号串要预测属于什么
语法成分,然后根据该语法成分的文法建立语法树。
2.分析过程是一种试探过程,是尽一切办法(选用不同规则)
设法建立语法树的过程,由于是试探过程,故难免有失败,
所以分析过程需进行回溯,因此我们也称这种方法是带
回溯的自顶向下分析方法。
4.1.2 自顶向下分析存在的问题及解决方法
但是还不能冒然宣布SL(G[Z])
4. 回溯 即砍掉A的子树 改选A的第二右部
Aa 检查 a-a匹配 d-d匹配
ab
分析工作要部 分地或全部地
Z·
退回去重做叫
回溯
cAd
建立语法树,末端结点为cad与输入cad相匹配, 建立了推导序列 ZcAdcad ∴cadL(G(Z))
a
9
自顶向下分析方法特点
有
把每个形如Ai→Ajr的规则替换成
左
Ai →(δ1|δ2|……δk) r
递
其中Aj →δ1|δ2|……δk是当前全部Aj 的规则
归
消除Ai规则中的直接左递归
的
end
算 法 3.化简由2得到的文法即可。
消除
直接左递归
16
例:文法G[s]为 S →Qc|c Q →Rb|b R →Sa|a
非终结符顺序 重新排列
我们可以通过一例子来说明语法分析过程
7
例:已知符号串S=cad 文法G[Z]:
Z→cAd
A→ab|a 求解 SL(G[Z])
分析过程 是设法建立一棵语法树, 使语法树的末端结点与
给定符号串相匹配.
1.开始:令Z为根结点
文法 E->E+T | T T->T*F | F F->(E) | i
消除左递归后: E->TE’, E’->+TE’ | ε T->FT’, T’->*F T’| ε F->(E) | i
例2 已知G[E]: E->T*F | T/F | F T->F | T*F | T/F
解:左递归改为右递归得:
1. 左递归文法:
左递归文法 回溯问题
文法G,存在U ∈Vn,if U=+=>U…, 则G为左递归文法
自顶向下分析方法的基本缺点:
不能处理具有左递归性的文法
自顶向下分析为什么不能处理左递归文法?
自顶向下分析为什么不能处理左递归文法?
在采用最左推导的自顶向下分析中,左递归的存在是十分有害 的,例如,考虑文法G[S]: SSa|b,分析输入串baaa是否为 文法的合法句子。按照自顶向下分析法,对输入串baaa的当前 输入符b从开始符号S开始进行最左推导,若首次使用SSa则 可能得到:
15
算法描述
1.把G的非终结符整理成某种顺序A1,A2,……An ,使得:
A1 ::= δ1|δ2|……δk
A2 ::= A1 r……
间接左递归
A3 ::= A2u | A1v…..
……. 一般左递归也可以通过改写法予以消除。
消 2. For i:=1 to n do
除
begin
直接左递归
所
for j :=1 to i-1 do
复 自动机、正则文法、正则表达式 习 的相互转化
1 2
NFA
正则文法4 3ຫໍສະໝຸດ 5 6正则表达式DFA
最小化
第四章 语法分析
4.1 自顶向下分析法
4.1.1 自顶向下分析的思想 4.1.2 左递归和回溯性质 4.1.3 递归子程序法(递归下降分析法) 4.1.4 LL(1)分析法
4.2 自底向上分析法
4.2.1 自底向上分析法概述 4.2.2 LR分析法的概念 4.2.3 LR(0)项目族的构造 4.2.4 SLR分析法 4.2.5 LALR分析法 4.2.6 二义性文法的应用
type simple | id | array [simple] of type simple integer | char | num dotdot num
使用类Pascal语言为非终结符type设计子程序如下: proccdure type; begin
case lookahead of in {integer, char, num}: simple( ) : begin
5.消除S的直接左递归
S→(abc|bc|c)S’
S’ →abc S’|ε
最后得到文法为:
S→(abc|bc|c)S’ Q→Sab|ab|b
S’ →abc S’|ε R→Sa|a
17
最后得到的文法:
S→(abc|bc|c)S’ S’ →abc S’|ε Q→Sab|ab|b R→Sa|a 可以看出其中关于Q和R的规则是多余的规则 ∴经过压缩后 S→(abc|bc|c)S’ S’ →abc S’|ε 可以证明改写前后的文法是等价的
R→Sa|a Q→Rb|b S→Qc|c
该文法是无直接左递归,但有间接左递归
SQc Rbc Sabc
∴ S +Sabc
1.检查规则R是否存在直接左递归 R→Sa|a
2.把R代入Q的有关选择,改写规则Q Q→Sab|ab|b
3.检查Q是否直接左递归
4.把Q代入S的右部选择
S→Sabc|abc|bc|c
E -> T*F | T/F | F
T -> FT’ T’ -> *FT’ | /FT’ | ε
14
②消除一般左递归
基本思想 先用代入法把间接左递归变成直接左递归,再消除 直接左递归,最后去掉多余规则以化简文法。
算法说明 要求文法不能含有回路(即形如P + P的推导),并且 不含作为规则的右部。
2.用Z的右部,符号串去匹配输入串
完成一步推导ZcAd 检查 c-c匹配 A是非终结符,将匹配任务交给A
Z Z·
cAd
8
S=cad G[Z]: Z→cAd A→ab|a
3. 选用A的右部符号串匹配输入串 A有两个右部,选第一个
Z·
完成进一步推导Aab 检查,a-a匹配,b-d不匹配(失败)
cAd
4
自顶向下分析算法的基本思想为:
若Z
+
S
则 S L(G[Z])
否则 S L(G[Z])
G[Z]
存在主要问题: 左递归问题 回溯问题
主要方法: • 递归子程序法 • LL分析法
自底向上分析算法的基本思想为:
若Z + S 则 S L(G[Z]) 否则 S L(G[Z])
G[Z]
SSaSaaSaaaSaaaa
如果文法具有间接左递归,则也将发生上述问题,只不过
环的圈子兜的更大。
要实行自顶向下分析,必须要消除文法的左递归,下面
我们将介绍直接左递归的消除方法,在此基础上再介
绍一般左递归的消除方法。
12
① 消除直接左递归:
将左递归规则改为右递归规则
若:P→P| 则可改写为:P → P’
应该指出,由于对非终结符的排序不同,最后得到的文法在形 式上可能是不一样的,但是不难证明它们的等价.
18
2. 回溯问题
什么是回溯?
分析工作要部分地或全部地退回去重做叫回溯
造成回溯的条件:
U::= 1 | 2 | 3
文法中,对于某个非终结符号的规则其右部 有多个选择,并根据所面临的输入符号不能准确 的确定所要选择时,就可能出现回溯。
消除回溯的途径:
改写文法
对具有多个右部的规则反复提取左因子
例 U→xV|xW
U, V, W∈Vn, x∈Vt
改写为U→x(V|W)
更清楚表示
U→xZ
Z→V|W
4.1.3 递归子程序法(递归下降分析法)
递归下降分析法也称递归子程序法,是一种直观易于构造的 自顶向下分析方法。分析过程则通过自上而下一级一级地调用 子程序来实现,所以称为递归下降分析法。 思想 为文法中每个非终结符编写一个递归过程,每个过程的功能是 识别由该非终结符推出的串,当某非终结符的产生式有多个候 选式时,按LL(1)形式唯一确定选择哪个候选式进行推导,若遇 到某候选式为,认为其自动匹配。把这些递归过程组合起来就 构成了文法的递归下降分析程序。 限制: 对文法要求高,必须满足LL(1)文法; 由于递归调用多,速度慢,占用空间多。 尽管这样,它还是许多高级语言的编译系统 经常采用的语法分析方法。
20
例子
设有文法G[S]: S->Aa|Bb A->d|cA B->b|aB
对S: FIRST(Aa)={d,c}, FIRST(Bb)={a,b}, FIRST(Aa) ∩FIRST(Bb)= φ
对A: FIRST(d)={d}, FIRST(CA)={c}, FIRST(d) ∩FIRST(Ca)= φ
回溯带来的问题:
严重的效率低,只有在理论上的意义而无实际意义
19
效率低的原因
1)语法分析要重做 2)语法处理工作要推倒重来
为避免回溯,对文法的要求是
FIRST(αi) ∩ FIRST(αj)=φ (ij) 非终结符的候选式的首符集两两不相交
[定义] 设文法G(不具左递归性) FIRST(α) = {a | α *aβ, a Vt , α,β V*} 若α * ε,则规定ε FIRST(α) 符号串α的所有可能推导出的开头终结符或ε
(2)对于形如Xi→Y1Y2…Yk(Yj∈VN∪VT)的产生式, 相应子程Pi( )是一个依次识别其右部各符号Yj (j=1,2,…,k)的过程:如果Yj∈VT,则判断当前输入 符号是否与Yj匹配;若Yj∈VN则应有调用相应于Yj的 子程序的代码。
(3)对于形如Xi→ε的产生式,在相应的子程序Pi( )中, 应该能够判断当前输入符号a是否属于集合 FOLLOW(Xi),从而决定是从Pi( )返回还是报错。
存在主要问题:
主要方法:
• 句柄的识别问题
• 算法优先分析法 • LR分析法
5
自顶向下分析
4.1.1 自顶向下分析的思想 4.1.2 自顶向下分析存在的问题及解决方法 4.1.3递归子程序法(递归下降分析法) 4.1.4 LL(1)分析法
6
4.1.1 自顶向下分析的思想
给定符号串S,若预测是某一语法成分, 那么可根据该语法成分的文法,设法为S构造一棵语法树. 若成功,则S最终被识别为某一语法成分,即
match (); match (id) end array: begin
match (array); match ( [ ); simple( ); match ( ] ); match (of ); type( ) end other error( ) end case end;
(4)在各个子程序Pi( )中,均应含有进行语法检查的 代码。
例1:下面文法产生Pascal类型的子集,我们用dotdot表 示“..”,以强调这个字符序列作为一个词法单元。 type simple | id | array [simple] of type simple integer | char | num dotdot num 显然该文法是LL(1)文法,为其构造递归下降分析器。
P’ →P’| ε
证明的关键步骤:
P->Pα | β P-> β | βα | βαα | βααα | …… P-> β (ε | α | αα | ααα | ……) P-> βP’, P’-> ε | α | αα | ααα | …… P-> βP’, P’-> ε | αP’
13
编译程序的功能和组织结构
表处理
前 端中 中后目端
源 程 序
词语语间间标 法法义代代代 分分分码码码 析析析生优生
目 标 程 序
成化成
错误处理
语法分析概述
功能:根据文法规则,从源程序单词符号串中
识别出语法成分,并进行语法检查。
基本任务:识别符号串S是否为某语法成分
两大类分析方法: 自顶向下分析
自底向上分析
对B: FIRST(b)={b}, FIRST(aB)={a}, FIRST(b) ∩FIRST(aB)= φ
若给定 w=abb
则自顶而下分析对应的推导为:
S=>Bb=>aBb=>abb
21
由此我们可以看出,如果文法中不含空符产生式,并且每个非终结符的 所有候选式右部的首符集两两不相交,则推导中就不会产生回溯。而提取左 因子正是为了达到这个目的,即反复提取左因子后,就能够把每个非终结符 (包括新引进的非终结符)的所有候选首符集变成两两不相交。因此,提取 左因子可以使得不含空符产生式的文法消除回溯。
• 递归下降分析器的设计
设文法G=(VN,VT,P,S), VN={X1,X2,…, Xn}。对G的每个非终结符号Xi,可以按照下面 方法设计子程序Pi( ):
(1)对于形如Xi→ γ1 | γ2 | …| γm 的产生式,在相应子 程序Pi( )中,应该能够判断当前输入符号a属于哪个候 选式γj 的FIRST集,并转入该候选式相应代码段,继 续识别。对候选式的选择可用if语句或case语句实现。
1.分析过程是带有预测的,对输入符号串要预测属于什么
语法成分,然后根据该语法成分的文法建立语法树。
2.分析过程是一种试探过程,是尽一切办法(选用不同规则)
设法建立语法树的过程,由于是试探过程,故难免有失败,
所以分析过程需进行回溯,因此我们也称这种方法是带
回溯的自顶向下分析方法。
4.1.2 自顶向下分析存在的问题及解决方法
但是还不能冒然宣布SL(G[Z])
4. 回溯 即砍掉A的子树 改选A的第二右部
Aa 检查 a-a匹配 d-d匹配
ab
分析工作要部 分地或全部地
Z·
退回去重做叫
回溯
cAd
建立语法树,末端结点为cad与输入cad相匹配, 建立了推导序列 ZcAdcad ∴cadL(G(Z))
a
9
自顶向下分析方法特点
有
把每个形如Ai→Ajr的规则替换成
左
Ai →(δ1|δ2|……δk) r
递
其中Aj →δ1|δ2|……δk是当前全部Aj 的规则
归
消除Ai规则中的直接左递归
的
end
算 法 3.化简由2得到的文法即可。
消除
直接左递归
16
例:文法G[s]为 S →Qc|c Q →Rb|b R →Sa|a
非终结符顺序 重新排列