32 正规文法和状态转换图

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

S ⇒a1A1 ⇒a1a2A2 ⇒…… ⇒a1a2…an-1An-1 ⇒ a 1 a 2 … an
右线性文法与状态转换图
是一右线性文法 是相应的状态转换图 右线性文法,M 状态转换图,则从前面的 设G是一右线性文法 M是相应的状态转换图 则从前面的 讨论可以看出如下事实: 讨论可以看出如下事实:
(1)在利用M对符号串w进行识别时 M中每次状态的转换都模拟了 在利用M 进行识别时,M 在利用 一步直接推导,即识别方法 或称分析方法) 即识别方法(或称分析方法 一步直接推导 即识别方法 或称分析方法 是“↓”的; (2)因右线性文法只有形如A→aB、A →a的产生式,所以推导的每 因右线性文法只有形如 aB、 的产生式, 一步所得句型只含一个非终结符,所以推导的规范的,每步所 一步所得句型只含一个非终结符,所以推导的规范的 规范 得的句型也必为规范句型 规范句型; 得的句型也必为规范句型; 必存在G中的一个推导 (3)对于M所识别的任一符号串x,必存在 中的一个推导S ⇒* x 对于M 必存在 对于 (即有x∈L(G);反之 对于L(G)中任一句子y,必存在一条从初态S 反之,对于 即有 必存在一条从初态 到终态F的路径,此路径上各矢线的标记依次拼接起来所组成的符 到终态F的路径 此路径上各矢线的标记依次拼接起来所组成的符 号串恰为y
由左线性文法构造状态转换图的例子
已给文法G=({S,U},{0,1},{S→S1 |U1, U→U0 | 0},S) 已给文法
U→0 U →U0 S →U1 S →S1 0 1 1
用左线性文法构造出的状态转 换图来识别文法的句子,其过 换图来识别文法的句子, 程与前面右线性文法构造的状 态转换图用法一样,这里不再 态转换图用法一样, 赘述. 赘述.
由左线性文法构造状态转换图
设G=(VN,VT,P,S) G=(V ,P,S)是一左线性文法,构造相应的 状态转换图的方法是: 首先用G的VN符标记M的结点,其中,开始符S对应 G V S 的结点为终态结点.另外,再引入一个新结点 R(∉VN)作为初态.矢线的连接规则为: R(∉ (1)对于G中形如A→a 的产生式,引矢线:R→A, G R 且标记为a; (2)对于G中形如A→Ba 的产生式,引矢线 B→A, 线 且标记为a.
程序3-2 状态矩阵驱动程序
CurStat=0; FlagOfFS=NoneSeen; /*将终态标志置为“未经历”*/ /*将终态标志置为 未经历” 将终态标志置为“ if(CurStat==EOF) return 0; while (CurStat != EOF){ if(Stat=TransMat[CurStat][Cur Char]!=NULL) { CurStat=Stat; advance( ); if( CurStat 是终态 是终态){ FlagOfFS=HasSeen; /*已经历过终态*/ /*已经历过终态 已经历过终态* 记下输入串中当前位置及该状态 相关的动作; 相关的动作 }/*end if CurStat 是终态*/ /*end 是终态* } else{ if(FlagOfFS==NoneSeen) { /*未经历过终态*/ /*未经历过终态*/ 未经历过终态 报告词法错误;略过当前词文及 报告词法错误 略过当前词文及 输入字符; 输入字符 CurStat=0; } else { 回退到最近经历的那个终态的 输入字符位置;执行所记录的该 输入字符位置 执行所记录的该 终态的相关动作; 终态的相关动作 } /*end if FlagOfFS==NoneSeen */ } /*end if Stat !=NULL*/ }/*end while*/ /*end
识别无符号数的状态矩阵
当前状 态 0 扫描字符 d . th e r d . E o th e r d E o th e r d o th e r d + o th e r d o th e r d o th e r 语义处理操作或接受动作 { w = 0 ;n = 0 ;p = 0 ;e = 1 ;w = w * 1 0 + d } { w = 0 ;n = 0 ;p = 0 ;e = 1 ;} e rro r { w = w * 1 0 + d ;} 后继状 态 1 3 1 2 4 end 2 4 end 2 6 5 5 6 6 end
识别符号串与归约
由构造状态转换图的方法可知,从初 从初 到下一状态A的转换, 态R到下一状态A的转换,对应了形如 B→a 的产生式 的产生式,即将终结符a归约成 非终结符B; 类似地,从状态B转换到状态A,对应 对应 的产生式,即将Ba归约 了形如A→Ba的产生式 为A ; 如此下去,直到从某状态A转换到状 U 态S(终态),对应了形如S →Aa的产 对应了形如 生式,即将Aa归约为开始符S.此时归 生式 约成功,也恰好进入了终态,即状态转 U 换图识别了(或接受)该符号串. 前面识别00011 00011的例子对应的归约 00011 过程见右图 0 0
<标识符>→<标识符>字母 标识符> 标识符> 标识符> 标识符> <标识符>→<标识符>数字 标识符> <标识符> →字母
若把字母、数字视为终结 符,则上述产生式为(左 线性)正规文法 若我们用d表示0-9间的 数字,则C语言的<无符 号数>的文法也是(右线 性)正规文法(见P48)
一般说来,凡能用正规文法描 述的语言,均可由某种有限状 状态转换图进行分 态算法——状态转换图 状态转换图 析。 状态转换图 由有限个结点所 组成的有向图。 每个结点代表在识别分析过程 中扫描器所处的状态,其中 含 有一个初始状态和若干个终态。 在图中,状态用圆圈表示,终 态用双层圆圈表示。 状态之间可用有向边连接,其 上标记一字符a∈Σ,表示从有 向边的射出状态出发,识别一 字符a后,将进入箭头所指状 态(结点)
不过,就识别的方法而言, 不过,就识别的方法而言,它却 属于“ 分析. 属于“↑”分析. 我们以句子00011为例, 我们以句子00011为例,给出其 00011为例 识别的的步骤.见右表. 识别的的步骤.见右表.
R
0
U
S
步骤 当前状态 余留的符号串 1 2 3 4 5 6 R U U U S S 00011 0011 011 11 1 (识别结束) 识别结束)
3.2 正规文法和状态转换图
正规文法定义了3型语言,常见的单词可由正 正规文法定义了3型语言,常见的单词可由正 规文法定义。 状态转换图可用于识别3型语言;它是设计和 状态转换图可用于识别3型语言;它是设计和 实现扫描器的一种有效工具,是有限自动机的 直观图示
3.2.1 由正规文法构造状态转换图
程序设计语言的单词都能 用正规文法描述; 例如,标识符可定义为
1
{ r e tu rn ( IC O N = w ) ; { n + + ; w = w * 1 0 + d ;} { r e tu rn ( F C O N = w * p o w ( 1 0 ,e * p -n ) ) ;} { n + + ;w = w * 1 0 + d ;} e rro r { p = p * 1 0 + d ;} e = -1 ; e rro r { p = p * 1 0 + d ;} e rro r { p = p * 1 0 + d ;} { r e tu rn ( F C O N = w * p o w ( 1 0 ,e * p -n ) ) ;
2
3
4
5 6
关于状态无符号数识别矩阵
语义 动作中的返回值ICON、FCON分别为整型数、浮点型 ICON、 数的值; 一般说来,无符号数具有形式dmdm-1…d0.d-1…d-nE±dd 即 dmdm-1…d0d-1…d-n*10^(±dd-n); *10^(±dd矩阵中w,p,n,e分别用于计录尾数、指数、小数位及指数的 符号。因此数值为: N=w*10^(e*p-n) N=w*10^(e*p处理整数部分时,对于每个di ,令w=w*10+di ; 处理小数部分时,对于每个di ,令w=w*10+di ;及n++; 处理指数时,E后若有‘-’号,令e=-1;计算指数值 E e=p=p*10+d; p=p*10+d; 在出口处,令ICON=w或FCON=w*10^(e*p-n). ICON=w或FCON=w*10^(e*p识别程序见P55 P55程序3-3。 3
S S U
0
1
1
状态转换图的实现3.2.2 状态转换图的实现-状态矩阵法
我们已看到,状态转换图 状态转换图可方便地用于识别单词.但是,如何让 状态转换图 计算机利用状态转换图来进行词法分析呢? 一个简单实用的方法就是将图以矩阵的形式保存在内存中. 这就是所谓的状态矩阵法 状态矩阵法. 状态矩阵法 状态矩阵 以图中各个状态S1,S2,…,Sn为行,以各个输入符号 a1,a2, …,am为列,组成一个n×m矩阵B,其元素Bij=B[Si,aj]指 B 明下一状态Sk和扫描器此时应完成的语义动作.其含义是,在 Si状态下,扫描到aj符时,按序偶(Si,aj)查矩阵B,扫描器根据Bij 的指示,先执行相应的语义动作,再转换到下个状态Sk. 若Bij为“出错 出错”,则说明输入符号串有误,拒绝接受.扫描器 将调用出错处理程序进行处理.
d d d d E E d d d
0ቤተ መጻሕፍቲ ባይዱ
.
d
1
2
3
4
+|-
5
6
利用状态转换图识别符号串的方法
利用~对 对于已给的字符串w=a1a2…an,ai∈VT,利用 对w 识别的 利用 步骤如下: 步骤如下 (1)从初始状态S出发,自左至右逐个扫描w的各个字符 从初始状态 出发 自左至右逐个扫描 (当前为a1),此时在结点S所射出的诸矢线中 寻找标记 当前为 此时在结点 所射出的诸矢线中,寻找标记 的矢线(若不存在 若不存在,则表明 有语法错误),读入 为a1的矢线 若不存在 则表明w有语法错误 读入a1并 沿矢线所指方向前进,过渡到下一状态 过渡到下一状态(设为 沿矢线所指方向前进 过渡到下一状态 设为A1). (2)设当前处在Ai状态 所扫描的字符为ai+1,在结点Ai所射 设当前处在 状态,所扫描的字符为 在结点 出的诸矢线中,寻找标记为 的矢线(若不存在 若不存在,则表明 出的诸矢线中 寻找标记为ai+1的矢线 若不存在 则表明 w有语法错误 读入ai+1,并进入状态Ai+1; 有语法错误),读入 并进入状态 (3)重复 重复(2),直到w中所有字符被读完且恰好进入终态F 重复 直到 宣告整个识别结束, 时,宣告整个识别结束 w可被接受 宣告整个识别结束 可被接受. 显然,若我们从初态出发 分别沿一切可能 路径到达 若我们从初态出发,分别沿一切可能的 到达终态 显然 若我们从初态出发 分别沿一切可能的路径到达终态 并将中径中矢线上所标记的字符依次连接起来,便 结点,并将中径中矢线上所标记的字符依次连接起来 结点 并将中径中矢线上所标记的字符依次连接起来 便 得到状态转换图所能识别的全部符号串 状态转换图所能识别的全部符号串,这些符号串组 得到状态转换图所能识别的全部符号串 这些符号串组 成的集合构成了该~识别的语言 成的集合构成了该 识别的语言
状态转换图与文法推导
用状态转换图识别符号串w的过程,就是为w建立一个 推导S⇒* w的过程。 在第一步(在初始状态S下,扫描到a1而过渡到下一状 态A1),由状态转换图的构造规则可知,G中必有产 生式S→a1A1;对于识别过程的后续步骤,由状态Ai识别 ai+1后过渡到Ai+1恰好对应了使用产生式Ai →ai+1Ai+1,…, 最后在状态An-1识别an后到达终态F,对应了使用产生 式 A →an 进行推导:
由右线性文法构造状态转换图
设G=(VN,VT,P,S)是一右线性文法,并设|VN|=K,则所要构造的状态 转换图共有K+1个状态(结点).用VN中的每个符号分别标记其中的 K个结点,且令G的开始符S为初态结点;余下的一个结点作为终态 结点,用F(∉VN)标记.我们用如下规则来连接这K+1个结点: ∉ (1)对于G中产生式A→aB,从结点A引一有向边到结点B,并用a标记这 → 一有向边; (2)对于G中产生式A→a,从结点A引一有向边到终态结点F,并用a标记 → 这一有向边; (3)对于G中产生式A→ε →ε(若有的话),则将结点A设为终态. →ε 例如,P48中定义的无符号数的文法对应的~为(化简后):
相关文档
最新文档