第2章 词法分析(new).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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)

0004499 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档