第3章 词法分析-1-状态转换图.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
例子: 已给文法G=({S,U},{0,1},{S?S1 |U1, U?U0 | 0},S) R U S U?0 0 U ?U0 0 S ?U1 1 S ?S1 1 用左线性文法构造出的状态转换图来识别文法的句子,其过程与前面右线性文法构造的状态转换图用法一样,这里不再赘述. 不过,就识别的方法而言,它却属于“?”分析. 以句子00011为例,给出其识别的的步骤.见右表. 识别的语言: 0m1m 步骤 当前状态 余留的符号串 1 R 00011 2 U 0011 3 U 011 4 U 11 5 S 1 6 S (识别结束) 三、由左线性文法构造状态转换图 识别符号串与归约 由构造状态转换图的方法可知,从初态R到下一状态A的转换,对应了形如B?a 的产生式,即将终结符a归约成非终结符B; 类似地,从状态B转换到状态A,对应了形如A?Ba的产生式,即将Ba归约为A; 如此下去,直到从某状态A转换到状态S(终态),对应了形如S ?Aa的产生式,即将Aa归约为开始符S.此时归约成功,也恰好进入了终态,即状态转换图识别了(或接受)该符号串. 前面识别00011的例子对应的归约过程见右图 0 0 0 1 1 U U U S S 三、由左线性文法构造状态转换图 * * 方法1:每个结点对应一段程序,前面状态的程序调用其后继结点的程序。 例1: 3.2.2状态转换图的实现 PROCEDURE Proc0; Getchar; case char of ‘A’…‘Z’ : proc1; ‘0’…‘9’: proc2; otherwise error; end of case; * * 为了描述方便,引入一些标准过程(函数)与变量: 1.全程字符变量Char:存放最新读入的源程序字符; 2.字符串TOKEN:存放构成单词符号的字符串; 3.过程GETChar:读入一个源程序字符,放入Char中,搜索指针前移; 4.过程GETNBC:反复调用 GETChar,直到读入的 Char ’ ’ 为止; 5.过程CONCAT:把Char中字符连到TOKEN末尾去; 6.函数Letter/digit:判别Char中是否为字母/数字; 7.过程Return (c, val ); 8.过程Retract:搜索器指针回拔一个字符。 3.2.2状态转换图的实现 * * 例2: PROCEDURE Pro0; BEGIN Getchar; IF char IN [‘A’..‘Z’ ] then pro1 else error; END; Procedure pro1; begin getchar; while char IN [‘A’..‘Z’, ‘o’..‘g’ ] DO begin concat; getchar; End; pro2; End; procedure pro2; begin retract; return(101,TOKEN ); end; 3.2.2 状态转换图的实现-状态矩阵法 一个简单实用的方法就是将图以矩阵的形式保存在内存中.这就是所谓的状态矩阵法. 状态矩阵 以图中各个状态S1,S2,…,Sn为行,以各个输入符号a1,a2, …,am为列,组成一个n?m矩阵B 元素Bij=B[Si,aj]指明下一状态Sk和扫描器此时应完成的语义动作.其含义是,在Si状态下,扫描到aj符时,按序偶(Si,aj)查矩阵B,扫描器根据Bij的指示,先执行相应的语义动作,再转换到下个状态Sk. 若Bij为“出错”,则说明输入符号串有误,拒绝接受.扫描器将调用出错处理程序进行处理. 程序3-2 状态矩阵驱动程序 CurStat=0; FlagOfFS=NoneSeen; /*将终态标志置为“未经历”*/ if(CurStat==EOF) return 0; while (CurStat != EOF){ if(Stat=TransMat[CurStat][CurChar]!=NULL) { CurStat=Stat; advance( ); if( CurStat 是终态){ FlagOfFS=HasSeen; /*已经历过终态*/ 记下输入串中当前位置及该状态相关的动作; }/*end if CurStat 是终态*/ } else{ if(FlagOfFS==NoneSeen) { /*未经历过终态*/ 报告词法错误;略过当前词文及输入字符; CurStat=0; } else { 回退到最近经历的那个终态的输入字

文档评论(0)

xingyuxiaxiang + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档