




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验5 用语法制导方式生成中间代码生成器魏陈强 23020092204168一、实验目的掌握语法制导定义和翻译的原理和技术,在语法分析器的基础上,加上语义分析,构造一个中间代码生成器。二、实验内容在实验四生成的语法分析器基础上加入语义动作,将源程序翻译为对应的中间代码序列。三、实验要求 1实验报告中给出采用测试源代码片断,及其对应的三地址码形式(内部表示形式可以自行考虑)。例如,程序片断 对应的中间代码为:4、 实验思路在前4次实验的基础上进行中间代码生成的编写,采用linux环境下的lex和yacc工具。首先编写goto.c函数,该函数实现符号表、回填、创建节点、定义节点属性等功能。Lex.l文件无需修改,yacc.y文件中,在每个生成式后加上语法制导翻译,主要是依据truelist和falselist来实现回填功能。编写完后,在yacc.y中以头文件的方式加入goto.c,编译即可。5、 实验代码 1、lex.l%letterA-Za-zdigit0-9%option noyywrap%if return( IF ); else return( ELSE ); |=|!=|= op_in(&yylval, yytext); return( REL); % 2、Yacc.y %#include goto.c #define YYSTYPE nodeint yyerror();int yyerror(char* msg);extern int yylex();codelist* list;%token BASIC NUMBER REAL ID TRUE FALSE%token INT CHAR BOOL FLOAT%token REL%token IF ELSE WHILE DO BREAK SWITCH CASE DEFAULT %token OR AND%left OR%left AND%right !%left + -%left * /%right UMINUS%right INC DEC%expect 1%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.nextlist; | 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 statement 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 ; backpatch(list, $3.nextlist, $4.instr); backpatch(list, $7.truelist, $9.instr); $.nextlist = $7.falselist; gen_goto(list, $2.instr); | BREAK ; | statementlist $.nextlist = $2.nextlist; | assignment ; $.nextlist = NULL; ;assignment : ID = boolean address(&$1, $1.lexeme); gen_assignment(list, $1, $3); ;loc: loc boolean | ID address(&$, $1.lexeme); ;boolean: boolean 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.falselist; $.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 address(&$, TRUE); gen_goto_blank(list); | FALSE address(&$, FALSE); gen_goto_blank(list); | expression addr_node(&$, $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_3addr(list, $, $1, +, $3); | expression - expression new_temp(&$, get_temp_index(list); gen_3addr(list, $, $1, -, $3); | expression * expression new_temp(&$, get_temp_index(list); gen_3addr(list, $, $1, *, $3); | expression / expression new_temp(&$, get_temp_index(list); gen_3addr(list, $, $1, /, $3); | - expression %prec UMINUS new_temp(&$, get_temp_index(list); gen_2addr(list, $, -, $2); | loc addr_node(&$, $1); | NUMBER address(&$, $1.lexeme); | REAL address(&$, $1.lexeme); ;%#includelex.yy.cint yyerror(char* msg)printf(nERROR with message: %sn, msg);return 0;int main()list = newcodelist();yyparse();print(list);return 0; 2、Goto.c #ifndef GOTO_C#define GOTO_C#include #include #include typedef struct listeleint instrno;struct listele *next;listele;listele* new_listele(int no)listele* p = (listele*)malloc(sizeof(listele);p-instrno = no;p-next = NULL;return p;typedef struct instrlistlistele *first,*last;instrlist;instrlist* new_instrlist(int instrno)instrlist* p = (instrlist*)malloc(sizeof(instrlist);p-first = p-last = new_listele(instrno);return p;instrlist* merge(instrlist *list1, instrlist *list2)instrlist *p;if (list1 = NULL) p = list2;elseif (list2!=NULL)if (list1-last = NULL)list1-first = list2-first;list1-last =list2-last;else list1-last-next = list2-first;list2-first = list2-last = NULL;free(list2);p = list1;return p;typedef struct node instrlist *truelist, *falselist, *nextlist;char addr256;char lexeme256;char oper3;int instr;node;int op_in(node *dst, char *src)strcpy(dst-oper, src);return 0;int lexeme_in(node *dst, char *yytext)strcpy(dst-lexeme, yytext);return 0;int address(node *dst, char *src)strcpy(dst-addr, src);return 0;int new_temp(node *dst, int index)sprintf(dst-addr, t%d, index);return 0;int addr_node(node *dst, node src)strcpy(dst-addr, src.addr);return 0;typedef struct codelist int linecnt, capacity;int temp_index;char *code;codelist; codelist* newcodelist()codelist* p = (codelist*)malloc(sizeof(codelist);p-linecnt = 0;p-capacity = 1024;p-temp_index = 0;p-code = (char*)malloc(sizeof(char*)*1024);return p;int get_temp_index(codelist* dst)return dst-temp_index+;int nextinstr(codelist *dst) return dst-linecnt; int Gen(codelist *dst, char *str)if (dst-linecnt = dst-capacity)dst-capacity += 1024;dst-code = (char*)realloc(dst-code, sizeof(char*)*dst-capacity);if (dst-code = NULL)printf(Error!n);return 0;dst-codedst-linecnt = (char*)malloc(strlen(str)+20);strcpy(dst-codedst-linecnt, str);dst-linecnt+;return 0;char tmp1024;int gen_goto_blank(codelist *dst)sprintf(tmp, goto);Gen(dst, tmp);return 0;int gen_goto(codelist *dst, int instrno)sprintf(tmp, goto L%d, instrno);Gen(dst, tmp);return 0;int gen_if(codelist *dst, node left, char* op, node right)sprintf(tmp, if %s %s %s goto, left.addr, op, right.addr);Gen(dst, tmp);return 0;int gen_1addr(codelist *dst, node left, char* op)sprintf(tmp, %s %s, left.addr, op);Gen(dst, tmp);return 0;int gen_2addr(codelist *dst, node left, char* op, node right)sprintf(tmp, %s = %s %s, left.addr, op, right.addr);Gen(dst, tmp);return 0;int gen_3addr(codelist *dst, node left, node op1, char* op, node op2)sprintf(tmp, %s = %s %s %s, left.addr, op1.addr, op, op2.addr);Gen(dst, tmp);retu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深圳2025年广东深圳市公办中小学招聘事业单位工作人员178人笔试历年参考题库附带答案详解
- 2025年监理工程师考试《建设工程监理案例分析(水利工程)》综合案例题
- 2020年成人高考《高等数学(一)》(专升本)真题
- 柜员业务操作总结
- 《愚公移山》优课件
- 九年级物理知识点:电学
- 2025年一建《机电工程管理与实务》考试合同管理与索赔题库冲刺试题
- 2025年《初级会计实务》章节重难点解析与实战复习试题汇编
- 2025年东北三省三校高三语文3月一模考试卷附答案解析
- 2025年中学教师资格考试《综合素质》核心考点特训题库(含答案)-教育科学研究篇
- 2025年安徽港航集团所属企业招聘13人笔试参考题库附带答案详解
- 2024年医师定期考核考题《临床练习》
- 反诈知识竞赛题库及答案(共286题)
- 《珍惜水资源共筑绿色梦》主题班会
- 一把手讲安全课件:提升全员安全意识
- 幼儿园食谱播报
- 无违法犯罪记录证明申请表(个人)
- 公开招聘社区居委专职工作人员考试笔试、面试题集及相关知识(11套试题含答案)
- 《植物生理学》课件第三章+植物的光合作用
- 中国药膳理论与实践-药膳基本理论和技能
- 华东师大版七年级初一数学下册全套试卷(单元、期中、期末)
评论
0/150
提交评论