实验五-编译-用语法制导方式生成中间代码生成器(共13页).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《实验五-编译-用语法制导方式生成中间代码生成器(共13页).doc》由会员分享,可在线阅读,更多相关《实验五-编译-用语法制导方式生成中间代码生成器(共13页).doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上实验5 用语法制导方式生成中间代码生成器一、实验目的掌握语法制导定义和翻译的原理和技术,在语法分析器的基础上,加上语义分析,构造一个中间代码生成器。二、实验内容在实验四生成的语法分析器基础上加入语义动作,将源程序翻译为对应的中间代码序列。三、实验要求1. 个人完成,提交实验报告。实验报告必须包括设计的思路,以及测试报告(输入测试例子,输出结果)。2. 实验报告中给出采用测试源代码片断,及其对应的三地址码形式(内部表示形式可以自行考虑)。例如,程序片断 对应的中间代码为:四、实验过程本次实验运用flex和bison工具进行中间代码的生成。并自动生成中间代码。1. 首先创
2、建一个example文件夹,该文件夹中包含有flex.exe2. 用文本编译器编辑相应的flex文件mylex.l,此次mylex.l可以在上次实验的l文件上做一些修改,再利用flex将l文件生成相应的lex.yy.c程序,mylex.l的代码如下所示: mylex.l%#include myyacc.tab.h%delim tnrwsdelim+letterA-Za-zdigit0-9idletter(letter|digit)*integerdigit+exponentE+-?integernumberintegerexponent?realinteger(.integer)?expone
3、nt?%option noyywrap%|=|!=|= filloperator(&yylval, yytext); return( REL); if return( IF ); else return( ELSE ); while return( WHILE ); do return( DO ); for return( FOR ); switch return( SWITCH ); case return( CASE ); default return( DEFAULT ); break return( BREAK ); true return( TRUE ); false return(
4、 FALSE ); int return( INT ); long return( LONG ); char return( CHAR ); bool return( BOOL ); float return( FLOAT ); double return( DOUBLE ); & return( AND ); | return( OR ); ! return( !); + return( INC ); - return( DEC ); + return( + ); - return( - ); * return( * ); / return( / ); = return( = ); retu
5、rn( ); return( ); return( ); return( ); ( return( ( ); ) return( ) ); ; return( ; ); ws id filllexeme(&yylval, yytext); return( ID ); number filllexeme(&yylval, yytext); return( NUMBER ); real filllexeme(&yylval, yytext); return( REAL ); %在代码中,先定义正则定义,即对letter,digit,专用符号, 空格进行声明;接着在转换规则中,定义一些识别规则的代码
6、。完成词法分析后,就可以将获取的每一个词素用于语法分析器使用。 将mylex.l与myyacc.y相结合的方法是在每获得一个词素,则用return语句返回,即如果获得的是if,则return(if),并且在头文件中加入#include myYacc.tab.h,则在myyacc中定义的类型在mylex中可利用,否则会出现返回的单元未定义的错误。3. 用文本编译器编辑相应的bison文件myyacc.y,myyacc.y文件中,在每个生成式后加上语法制导翻译,主要是依据truelist和falselist来实现回填功能。编写完后,在myyacc.y中以头文件的方式加入自己编写的myyacc.h文
7、件,编译即可。Myyacc.y的代码如下所示:Myyacc.y%#include myyacc.h#define YYSTYPE node#include myyacc.tab.hint yyerror();int yyerror(char* msg);extern int yylex();codelist* list;%token BASIC NUMBER REAL ID TRUE FALSE%token INT LONG CHAR BOOL FLOAT DOUBLE%token REL%token IF ELSE WHILE DO BREAK FOR SWITCH CASE DEFAULT
8、 %token OR AND%left OR%left AND%right !%left + -%left * /%right UMINUS%right INC DEC%program : block ;block : decls statementlist ;decls: decls decl | ;decl: type ID ; ;type: type NUMBER | BASIC ;statementlist: statementlist M statement backpatch(list, $1.nextlist, $2.instr); $.nextlist = $3.nextlis
9、t; | statement $.nextlist = $1.nextlist; ;Statement : IF ( boolean ) M statement ELSE N M statement backpatch(list, $3.truelist, $5.instr); backpatch(list, $3.falselist, $9.instr); $6.nextlist = merge($6.nextlist, $8.nextlist); $.nextlist = merge($6.nextlist, $10.nextlist); | IF ( boolean ) M statem
10、ent backpatch(list, $3.truelist, $5.instr); $.nextlist = merge($3.falselist, $6.nextlist); | WHILE M ( boolean ) M statement backpatch(list, $7.nextlist, $2.instr); backpatch(list, $4.truelist, $6.instr); $.nextlist = $4.falselist; gen_goto(list, $2.instr); | DO M statement M WHILE ( boolean ) M ; b
11、ackpatch(list, $3.nextlist, $4.instr); backpatch(list, $7.truelist, $9.instr); $.nextlist = $7.falselist; gen_goto(list, $2.instr); | FOR ( assignment ; M boolean ; M assignment ) N M statement backpatch(list, $6.truelist, $12.instr);backpatch(list, $11.nextlist, $5.instr);backpatch(list, $13.nextli
12、st, $8.instr);$.nextlist = $6.falselist;gen_goto(list, $8.instr); | BREAK ; | statementlist $.nextlist = $2.nextlist; | assignment ; $.nextlist = NULL; ;assignment: ID = boolean copyaddr(&$1, $1.lexeme); gen_assignment(list, $1, $3); ;loc : loc boolean | ID copyaddr(&$, $1.lexeme); ;boolean : boolea
13、n OR M boolean backpatch(list, $1.falselist, $3.instr); $.truelist = merge($1.truelist, $4.truelist); $.falselist = $4.falselist; | boolean AND M boolean backpatch(list, $1.truelist, $3.instr); $.truelist = $4.truelist; $.falselist = merge($1.falselist, $4.falselist); | ! boolean $.truelist = $1.fal
14、selist; $.falselist = $1.truelist; | ( boolean ) $.truelist = $1.truelist; $.falselist = $1.falselist; | expression REL expression $.truelist = new_instrlist(nextinstr(list); $.falselist = new_instrlist(nextinstr(list)+1); gen_if(list, $1, $2.oper, $3); gen_goto_blank(list); | TRUE copyaddr(&$, TRUE
15、); gen_goto_blank(list); | FALSE copyaddr(&$, FALSE); gen_goto_blank(list); | expression copyaddr_fromnode(&$, $1); ;M : $.instr = nextinstr(list); ;N : $.nextlist = new_instrlist(nextinstr(list); gen_goto_blank(list); ;expression : expression + expression new_temp(&$, get_temp_index(list); gen_3add
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 编译 用语 法制 方式 生成 中间 代码 生成器 13
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内