资源描述:
《实验五用语法制导方式生成中间代码生成器》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、实验5用语法制导方式生成中间代码生成器魏陈强23020092204168一、实验目的掌握语法制导定义和翻译的原理和技术,在语法分析器的基础上,加上语义分析,构造一个中间代码生成器。二、实验内容在实验四生成的语法分析器基础上加入语义动作,将源程序翻译为对应的中间代码序列。三、实验要求1.实验报告中给出采用测试源代码片断,及其对应的三地址码形式(内部表示形式可以自行考虑)。例如,程序片断 对应的中间代码为:四、实验思路在前4次实验的基础上进行中间代码生成的编写,采用linux环境下的lex和yacc工具。首先编写goto.c函数,该函数实现符号表、回填、创建节点、定义节点属性等功能。
2、Lex.l文件无需修改,yacc.y文件中,在每个生成式后加上语法制导翻译,主要是依据truelist和falselist来实现回填功能。编写完后,在yacc.y中以头文件的方式加入goto.c,编译即可。五、实验代码1、lex.l%{%}……letter[A-Za-z]digit[0-9]……%optionnoyywrap%%if{return(IF);}else{return(ELSE);}……"<"
3、"<="
4、">"
5、">="
6、"!="
7、"=="{op_in(&yylval,yytext);return(REL);}……%%2、Yacc.y%{#include"goto.c
8、"#defineYYSTYPEnodeintyyerror();intyyerror(char*msg);externintyylex();codelist*list;%}%tokenBASICNUMBERREALIDTRUEFALSE%tokenINTCHARBOOLFLOAT%tokenREL%tokenIFELSEWHILEDOBREAKSWITCHCASEDEFAULT%tokenORAND%leftOR%leftAND%right'!'%left'+''-'%left'*''/'%rightUMINUS%rightINCDEC%expect1%%program:bloc
9、k{};block:'{'declsstatementlist'}'{};decls:declsdecl{}
10、{};decl:typeID';'{};type:type'['NUMBER']'{}
11、BASIC{};statementlist:statementlistMstatement{backpatch(list,$1.nextlist,$2.instr);$$.nextlist=$3.nextlist;}
12、statement{$$.nextlist=$1.nextlist;};statement:IF'('boolean')'MstatementELSENMstatemen
13、t{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);}
14、IF'('boolean')'Mstatement{backpatch(list,$3.truelist,$5.instr);$$.nextlist=merge($3.falselist,$6.nextlist);}
15、WHILEM'('boolean')
16、'Mstatement{backpatch(list,$7.nextlist,$2.instr);backpatch(list,$4.truelist,$6.instr);$$.nextlist=$4.falselist;gen_goto(list,$2.instr);}
17、DOMstatementMWHILE'('boolean')'M';'{backpatch(list,$3.nextlist,$4.instr);backpatch(list,$7.truelist,$9.instr);$$.nextlist=$7.falselist;gen_goto(list,$2.inst
18、r);}
19、BREAK';'{}
20、'{'statementlist'}'{$$.nextlist=$2.nextlist;}
21、assignment';'{$$.nextlist=NULL;};assignment:ID'='boolean{address(&$1,$1.lexeme);gen_assignment(list,$1,$3);};loc:loc'['boolean']'{}
22、ID{address(&$$,$1.lexeme);};boolean:booleanORMbo