欢迎来到天天文库
浏览记录
ID:55410896
大小:192.00 KB
页数:13页
时间:2020-05-12
《实验五-编译-用语法制导方式生成中间代码生成器.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验5用语法制导方式生成中间代码生成器一、实验目的掌握语法制导定义和翻译的原理和技术,在语法分析器的基础上,加上语义分析,构造一个中间代码生成器。二、实验内容在实验四生成的语法分析器基础上加入语义动作,将源程序翻译为对应的中间代码序列。三、实验要求1.个人完成,提交实验报告。实验报告必须包括设计的思路,以及测试报告(输入测试例子,输出结果)。2.实验报告中给出采用测试源代码片断,及其对应的三地址码形式(内部表示形式可以自行考虑)。例如,程序片断 对应的中间代码为:四、实验过程本次实验运用flex和bison工具进行中间代码的生成。并自动生成中间代码。1.首先创建一个e
2、xample文件夹,该文件夹中包含有flex.exe2.用文本编译器编辑相应的flex文件mylex.l,此次mylex.l可以在上次实验的l文件上做一些修改,再利用flex将l文件生成相应的lex.yy.c程序,mylex.l的代码如下所示:mylex.l%{#include"myyacc.tab.h"%}delim[tr]ws{delim}+letter[A-Za-z]digit[0-9]id{letter}({letter}
3、{digit})*integer{digit}+exponentE[+-]?{integer}number{integer}{ex
4、ponent}?realinteger(.integer)?{exponent}?%optionnoyywrap%%"<"
5、"<="
6、">"
7、">="
8、"!="
9、"=="{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);}brea
10、k{return(BREAK);}true{return(TRUE);}false{return(FALSE);}int{return(INT);}long{return(LONG);}char{return(CHAR);}bool{return(BOOL);}float{return(FLOAT);}double{return(DOUBLE);}"&&"{return(AND);}"
11、
12、"{return(OR);}"!"{return('!');}"++"{return(INC);}"--"{return(DEC);}"+"{return('+');}"-"{ret
13、urn('-');}"*"{return('*');}"/"{return('/');}"="{return('=');}"{"{return('{');}"}"{return('}');}"["{return('[');}"]"{return(']');}"("{return('(');}")"{return(')');}";"{return(';');}{ws}{}{id}{filllexeme(&yylval,yytext);return(ID);}{number}{filllexeme(&yylval,yytext);return(NUMBER);}{real
14、}{filllexeme(&yylval,yytext);return(REAL);}%%在代码中,先定义正则定义,即对letter,digit,专用符号,空格进行声明;接着在转换规则中,定义一些识别规则的代码。完成词法分析后,就可以将获取的每一个词素用于语法分析器使用。将mylex.l与myyacc.y相结合的方法是在每获得一个词素,则用return语句返回,即如果获得的是if,则return(if),并且在头文件中加入#include"myYacc.tab.h",则在myyacc中定义的类型在mylex中可利用,否则会出现返回的单元未定义的错误。1.用文本编译器编
15、辑相应的bison文件myyacc.y,myyacc.y文件中,在每个生成式后加上语法制导翻译,主要是依据truelist和falselist来实现回填功能。编写完后,在myyacc.y中以头文件的方式加入自己编写的myyacc.h文件,编译即可。Myyacc.y的代码如下所示:Myyacc.y%{#include"myyacc.h"#defineYYSTYPEnode#include"myyacc.tab.h"intyyerror();intyyerror(char*msg);externintyylex();codelist*list;%}%to
此文档下载收益归作者所有