自动机、正则文法、正则表达式的相互转化

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)= φ 对B: FIRST(b)={b}, FIRST(aB)={a}, FIRST(b) ∩FIRST(aB)= φ
• P的递归子程序
P() { if(w==“(”) { get_w(); E(); if(w==“)”) get_w(); else error(); } else if(w==“i”) get_w(); else error(); }
另一个例子
• 对于文法G[E]: EE+T|T TT*F|F F(E)|i • 经消除左递归后得到G[E]: ETE E +TE| TFT T *FT| F(E)|i
• E的递归子程序
E() { T(); while(w==“+”||w==“-”) { get_w(); T(); } }
• T的递归子程序
T() { F(); while(w==“*”||w==“/”) { get_w(); F(); } }
• F的递归子程序
F() { P(); while(w==“”) { get_w(); P(); } }
复 习
自动机、正则文法、正则表达式 的相互转化
1 正则文法 5
2
4 NFA DFA 最小化
6
正则表达式
3
第四章 语法分析
4.1 自顶向下分析法
4.1.1 自顶向下分析的思想 4.1.2 左递归和回溯性质 4.1.3 递归子程序法(递归下降分析法) 4.1.4 LL(1)分析法
4.2 自底向上分析法
• E的递归子程序
E() { T(); E(); }
• E的递归子程序
E() { if(w==“+”) { get_w(); T(); E(); } }
• T的递归子程序
T() { F(); T(); }
• T的递归子程序
T() { if(w==“*”) { get_w(); F(); T(); } }
分析工作要部 分地或全部地 退回去重做叫 回溯
b
建立语法树,末端结点为cad与输入cad相匹配, 建立了推导序列 ZcAdcad ∴cadL(G(Z))
自顶向下分析方法特点
1.分析过程是带有预测的,对输入符号串要预测属于什么 语法成分,然后根据该语法成分的文法建立语法树。
2.分析过程是一种试探过程,是尽一切办法(选用不同规则) 设法建立语法树的过程,由于是试探过程,故难免有失败, 所以分析过程需进行回溯,因此我们也称这种方法是带 回溯的自顶向下分析方法。
4.1.2 自顶向下分析存在的问题及解决方法 4.1.3递归子程序法(递归下降分析法) 4.1.4 LL(1)分析法
6
4.1.1 自顶向下分析的思想
给定符号串S,若预测是某一语法成分, 那么可根据该语法成分的文法,设法为S构造一棵语法树.
若成功,则S最终被识别为某一语法成分,即 SL(G[Z])其中G[Z]为某语言成分的文法. 若不成功,则 SL(G[Z])
递归下降分析法也称递归子程序法,是一种直观易于构造的 自顶向下分析方法。分析过程则通过自上而下一级一级地调用 子程序来实现,所以称为递归下降分析法。 思想 对文法中的每个非终结符编写一个处理子程序,处理子程序的 代码结构由相应的非终结符的规则右部来决定:规则右部的终 结符号与输入符号相匹配,非终结符与相应的子程序调用相对 应,非终结符对应的各个候选式与分支结构相对应。 限制: 对文法要求高,必须满足LL(1)文法; 由于递归调用多,速度慢,占用空间多。 尽管这样,它还是许多高级语言的编译系统 经常采用的语法分析方法。
E -> T*F | T/F | F
T -> FT’ T’ -> *FT’ | /FT’ | ε
14
②消除一般左递归
基本思想 先用代入法把间接左递归变成直接左递归,再消除 直接左递归,最后去掉多余规则以化简文法。
算法说明 要求文法不能含有回路(即形如P + P的推导),并且 不含作为规则的右部。
目 标 程 序
错 误 处 理
语法分析概述
功能:根据文法规则,从源程序单词符号串中
识别出语法成分,并进行语法检查。
基本任务:识别符号串S是否为某语法成分 两大类分析方法:
自顶向下分析
自底向上分析
4
自顶向下分析算法的基本思想为: 若Z S
G[Z] +
则 S L(G[Z])
否则 S L(G[Z])

• 设有文法G[E]: EE+T|E-T|T TT*F|T/F|F FPF|P P(E)|i • 用EBNF表示消除左递归得到文法G[E]: ET{(+|-)T} T -> FT’ TF{(*|/)F} T’ -> *FT’ | /FT’ | ε FP{P} P(E)|i
递归子程序
我们可以通过一例子来说明语法分析过程
7
例:已知符号串S=cad 文法G[Z]: Z→cAd A→ab|a 求解 SL(G[Z]) 1.开始:令Z为根结点
分析过程 是设法建立一棵语法树, 使语法树的末端结点与 给定符号串相匹配. Z Z ·
2.用Z的右部,符号串去匹配输入串
完成一步推导ZcAd 检查 c-c匹配 A是非终结符,将匹配任务交给A
4.2.1 自底向上分析法概述 4.2.2 LR分析法的概念 4.2.3 LR(0)项目族的构造 4.2.4 SLR分析法 4.2.5 LALR分析法 4.2.6 二义性文法的应用
编译程序的功能和组织结构
表 处 理 前 端 中
源 程 序
词 法 分 析
语 法 பைடு நூலகம் 析
语 义 分 析
间 代 码 生 成
中 后 目 端 间 标 代 代 码 码 优 生 化 成
13
文法 E->E+T | T T->T*F | F F->(E) | i
消除左递归后:
E->TE’, T->FT’, F->(E)
E’->+TE’ | ε T’->*F T’| ε
|i
例2 已知G[E]: E->T*F | T/F | F T->F | T*F | T/F
解:左递归改为右递归得:
• F的递归子程序
F() { if(w==“(”) { get_w(); E(); if(w==“)”) get_w(); else error(); } else if(w==“i”) get_w(); else error(); }
• 扩展的巴科斯范式(EBNF)
EBNF是在BNF基础上扩展如下三组符号: – “{ }”:表示花括号内的语法成分可以重复; – “[ ]”:表示方括号内的成分是可选项; – “( )”:表示括号内的成分优先。
• 用EBNF改写文法
对于非终结符 A的一组形如 Ax|y||z|Aa的规 则,可表示成 A(x|y||z){a} 。例如,对于规 则EE+T|T,可以写成ET{+T}。
12
① 消除直接左递归:
将左递归规则改为右递归规则
若:P→P| 则可改写为:P → P’ P’ →P’| ε 证明的关键步骤:
P->Pα
|β P-> β | βα | βαα | βααα | …… P-> β (ε | α | αα | ααα | ……) P-> βP’, P’-> ε | α | αα | ααα | …… P-> βP’, P’-> ε | αP’
为避免回溯,对文法的要求是
FIRST(αi) ∩ FIRST(αj)=φ (ij) 非终结符的候选式的首符集两两不相交
[定义] 设文法G(不具左递归性) FIRST(α) = {a | α *aβ, a Vt , α,β V*} * ε,则规定ε FIRST(α) 若α 符号串α的所有可能推导出的开头终结符或ε
造成回溯的条件:
U::= 1 | 2 | 3
文法中,对于某个非终结符号的规则其右部 有多个选择,并根据所面临的输入符号不能准确 的确定所要选择时,就可能出现回溯。 回溯带来的问题:
严重的效率低,只有在理论上的意义而无实际意义
19
效率低的原因 1)语法分析要重做
2)语法处理工作要推倒重来
可以看出其中关于Q和R的规则是多余的规则 ∴经过压缩后 S→(abc|bc|c)S’ S’ →abc S’|ε 可以证明改写前后的文法是等价的
应该指出,由于对非终结符的排序不同,最后得到的文法在形 式上可能是不一样的,但是不难证明它们的等价.
18
2. 回溯问题
什么是回溯?
分析工作要部分地或全部地退回去重做叫回溯
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 把每个形如Ai→Ajr的规则替换成 Ai →(δ1|δ2|……δk) r 其中Aj →δ1|δ2|……δk是当前全部Aj 的规则 消除Ai规则中的直接左递归 消除 end 直接左递归 3.化简由2得到的文法即可。
若给定 w=abb 则自顶而下分析对应的推导为: S=>Bb=>aBb=>abb
21
消除回溯的途径:
改写文法
对具有多个右部的规则反复提取左因子 例 U→xV|xW U, V, W∈Vn, x∈Vt
改写为U→x(V|W) 更清楚表示 U→xZ Z→V|W
22
4.1.3 递归子程序法(递归下降分析法)
R→Sa|a
Q→Sab|ab|b
4.把Q代入S的右部选择 5.消除S的直接左递归
最后得到文法为:
S→Sabc|abc|bc|c S→(abc|bc|c)S’ S’ →abc S’|ε S→(abc|bc|c)S’ S’ →abc S’|ε Q→Sab|ab|b R→Sa|a
17
最后得到的文法: S→(abc|bc|c)S’ S’ →abc S’|ε Q→Sab|ab|b R→Sa|a
4.1.2 自顶向下分析存在的问题及解决方法
1. 左递归文法:
左递归文法 回溯问题
+ 文法G,存在U ∈Vn,if U==>U…, 则G为左递归文法
自顶向下分析方法的基本缺点:
不能处理具有左递归性的文法
自顶向下分析为什么不能处理左递归文法?
自顶向下分析为什么不能处理左递归文法?
在采用最左推导的自顶向下分析中,左递归的存在是十分有害 的,例如,考虑文法G[S]: SSa|b,分析输入串baaa是否为 文法的合法句子。按照自顶向下分析法,对输入串baaa的当前 输入符b从开始符号S开始进行最左推导,若首次使用SSa则 可能得到: SSaSaaSaaaSaaaa 如果文法具有间接左递归,则也将发生上述问题,只不过 环的圈子兜的更大。 要实行自顶向下分析,必须要消除文法的左递归,下面 我们将介绍直接左递归的消除方法,在此基础上再介 绍一般左递归的消除方法。
存在主要问题: 左递归问题 回溯问题
主要方法: • 递归子程序法 • LL分析法
自底向上分析算法的基本思想为: 若Z S
G[Z] +
则 S L(G[Z])
否则 S L(G[Z])
存在主要问题: • 句柄的识别问题
主要方法: • 算法优先分析法 • LR分析法
5
自顶向下分析
4.1.1 自顶向下分析的思想
16
消 除 所 有 左 递 归 的 算 法
例:文法G[s]为 S →Qc|c Q →Rb|b R →Sa|a
非终结符顺序 重新排列
R→Sa|a Q→Rb|b S→Qc|c
该文法是无直接左递归,但有间接左递归 SQc Rbc Sabc ∴S+ Sabc
1.检查规则R是否存在直接左递归
2.把R代入Q的有关选择,改写规则Q 3.检查Q是否直接左递归
c A d
8
S=cad 3. 选用A的右部符号串匹配输入串 A有两个右部,选第一个
G[Z]: Z→cAd A→ab|a
Z ·
c A d a Z · c A d a
9
完成进一步推导Aab 检查,a-a匹配,b-d不匹配(失败) 但是还不能冒然宣布SL(G[Z]) 4. 回溯 即砍掉A的子树 改选A的第二右部 Aa 检查 a-a匹配 d-d匹配
相关文档
最新文档