网站大量收购独家精品文档,联系QQ:2885784924

编译实验二.docx

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译实验二

使用flex和bison生成语法分析器: 首先对第一次实验中的词法分析器的程序进行修改: %option noyywrap %{ #includestdio.h #includestdlib.h #includebiso.tab.h %} identifier_int [A-Za-z]([A-Za-z]|[0-9])* decimalism_int 0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* octonary_int 0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* hexadecimal 0(x|X)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* space [ \n\t] %% {space} { } if {return IF;} then {return THEN;} else {return ELSE;} while {return WHILE;} do {return DO;} + {return add;} - {return sub;} * {return mul;} / {return divi;} ; {return semicolon;} = {return equal;} {return greater_than;} {return less_than;} = {return LE;} = {return GE;} [A-Za-z]([A-Za-z]|[0-9])* {return IDE;} (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*|0 {return INT10;} 0(0|1|2|3|4|5|6|7)+ {return INT8;} 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* {return INT16;} ( {return left_bracket;} ) {return right_bracket;} %% 我们可以看到,相较于第一个实验中的头文件,宏定义全部删除,增加了一个头文件,biso.tab.h,这个头文件是bison代码编译后生成的文件,在这个文件中,我们可以看到实验一中所有宏定义。 然后将实验一中代码的主函数等全部删除,只留下第一部分和第二部分。 接着实现bison部分代码,这个部分是调用实验一的词法分析程序来采用LALR(1)文法来分析语法: %{ #includectype.h #includestdio.h %} %token IDE %token INT8 %token INT10 %token INT16 %token IF left_bracket right_bracket ELSE THEN WHILE DO add sub mul divi semicolon equal greater_than less_than GE LE %% S:IDE equal E{ printf(S - IDE=E\n); } |IF C THEN S{ printf(S - IF C THEN S\n); } |WHILE C DO S{ printf(S - WHILE C DO S\n); }; C:E greater_than E{ printf(C - EE\n); } |E less_than E{ printf(C - EE\n); } |E equal E{ printf(C - E=E\n); }; E:E add T{ printf(E - E+T\n); } |E sub T{ printf(E - E-T\n); } |T{ printf(E - T\n); }; T:F{ printf(T - F\n); } |T mul F{ printf(T - T*F\n); } |T divi F{ printf(T - T/F\n); }; F:IDE{ printf(F - IDE\n); } |left_bracket E right_bracket{ printf(F - (E)\n); } |INT8{ printf(F - INT8\n); } |INT10{ printf(F - INT10\n); } |INT16{ printf(F - INT16\n); }; %% #include lex.yy.c main(int argc,char **argv) {

文档评论(0)

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

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

1亿VIP精品文档

相关文档