- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* * * 其次,将保留字作为一类特殊的标识符来处理,也即对保留字不专设对应的状态转换图,当转换图识别出一个标识符时就去查对表2.1的前五项,确定它是否为一个保留字。当然,也可以专设一个保留字表来进行处理。 2.2.2 C语言子集对应的状态转换图 * 图2-5 简单词法分析的状态转换图 返回(id,id在符号表中的位置)或返回(保留字,—) 返回(num,num在常数表中的位置) * 1 2 0 字母 非字母与数字 字母或数字 * 空白 5 4 3 数字 数字 非数字 * 6 10 11 13 12 7 * 8 9 其它 ; ( { 其他 = + = 返回(+,—) 返回(=,—) 返回(relop,EQ) 返回(;—) 返回({—) 非法字符错 * 状态转换图非常容易用程序实现,最简单的办法是让每个状态对应一小段程序。对于图2-5所示的状态转换图,我们首先引进一组变量和函数如下: 2.2.3 状态转换图的实现 * (1) ?character:字符变量,存放最新读入的源程序字符。(2) ?token:字符数组,存放构成单词符号的字符串。(3) ?getbe(?):若character中的字符为空白,则调用getchar( ),直至character为非空白字符为止。 * (4) ?concatenation(?):将token中的字符串与character中的字符连接并作为token中新的字符串。(5) ?letter( )和digit(?):判断character中的字符是否为字母和数字的布尔函数,是则返回true(即1),否则返回false(即0)。 * (6) ?reserve(?):按token数组中的字符串查表2.1中的前五项(即判别其是否为保留字),若是保留字则返回它的编码,否则返回0值。(7) ?retract(?):扫描指针回退一个字符,同时将character置为空白。 * (8) ?buildlist(?):将标识符登录到符号表中或将常数登录到常数表中。(9) ?error( ):出现非法字符,显示出错信息。 * token= ‘ ’; /*对token数组初始化*/s=getchar( );getbe( ); /*滤除空格*/switch(s){ case ‘a’: case ‘b’: … case z: 相对于图2-5的词法分析器构造如下: * while (letter( )‖digit( )) { concatenation( ); /*将当前读入的字符送入token数组*/ getchar( ); } retract( ); *扫描指针回退一个字符*/ c=reserve( ); if (c==0) { * buildlist( ); /*将标识符登录到符号表中*/ return(id,指向id的符号表入口指针); } else return(保留字码,null); break; case ‘0’: case ‘1’: … case 9: * while (digit( )) { concatenation( ); getchar( ); } retract( ); buildlist( ); /*将常数登录到常数表中*/ return (num,num的常数表入口指针); break; case +: * return(+,null); break; case ?: return(?,null); break; case *: return(*,null); break; case : getchar( ); if (character = = =) return(relop,LE); else { retract( ); return(relop,LT); } break; case =: getchar( ); * if(character= = ‘=’) return (relop, EQ);else{ retract( ); return(=, null);}break; case ;: return(;, null); break; default: error( ); *
文档评论(0)