ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:162.58KB ,
资源ID:21964819      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21964819.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验五编译用语法制导方式生成中间代码生成器Word格式文档下载.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验五编译用语法制导方式生成中间代码生成器Word格式文档下载.docx

1、=!= 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( FALSE );int return( INT );long re

2、turn( LONG );char return( CHAR );bool return( BOOL );float return( FLOAT );double return( DOUBLE );& return( AND );| return( OR ); return( );+ return( INC );- return( DEC );+ );-*/=();ws id filllexeme(& return( ID );number filllexeme(& return( NUMBER );real filllexeme(& return( REAL );在代码中,先定义正则定义,即

3、对letter,digit,专用符号, 空格进行声明;接着在转换规则中,定义一些识别规则的代码。完成词法分析后,就可以将获取的每一个词素用于语法分析器使用。 将mylex.l与myyacc.y相结合的方法是在每获得一个词素,则用return语句返回,即如果获得的是if,则return(if),并且在头文件中加入#include myYacc.tab.h,则在myyacc中定义的类型在mylex中可利用,否则会出现返回的单元未定义的错误。3. 用文本编译器编辑相应的bison文件myyacc.y,myyacc.y文件中,在每个生成式后加上语法制导翻译,主要是依据truelist和falselis

4、t来实现回填功能。编写完后,在myyacc.y中以头文件的方式加入自己编写的myyacc.h文件,编译即可。Myyacc.y的代码如下所示:Myyacc.ymyyacc.h #define YYSTYPE node int 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 FO

5、R SWITCH CASE DEFAULT %token OR AND%left OR%left AND%right %left %right UMINUS%right INC DECprogram : 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.ne

6、xtlist; | 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 M statement backpat

7、ch(list, $3.truelist, $5.instr); $.nextlist = merge($3.falselist, $6.nextlist); | WHILE M 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 M backpatch(list, $3.nextlist, $4.instr)

8、; backpatch(list, $7.truelist, $9.instr); $.nextlist = $7.falselist; | FOR assignment M boolean M assignment N M statement backpatch(list, $6.truelist, $12.instr); backpatch(list, $11.nextlist, $5.instr); backpatch(list, $13.nextlist, $8.instr); $.nextlist = $6.falselist; gen_goto(list, $8.instr); |

9、 BREAK | statementlist $.nextlist = $2.nextlist; | assignment $.nextlist = NULL;assignment : ID boolean copyaddr(&$1, $1.lexeme); gen_assignment(list, $1, $3);loc : loc | ID copyaddr(&$, $1.lexeme);boolean : boolean OR M boolean backpatch(list, $1.falselist, $3.instr); $.truelist = merge($1.truelist

10、, $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; $.truelist = $1.truelist; $.falselist = $1.falselist; |

11、 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 | FALSE copyaddr(&FALSE | expression copyaddr_fromnode(&$, $1);M : $.instr = nextinstr(list);N : $.next

12、list = new_instrlist(nextinstr(list);expression : expression expression new_temp(&$, get_temp_index(list); gen_3addr(list, $, $1, , $3); | expression expression %prec UMINUS new_temp(& gen_2addr(list, $, , $2); | loc copyaddr_fromnode(& | NUMBER copyaddr(& | REAL copyaddr(&int yyerror(char* msg) pri

13、ntf(nERROR with message: %sn, msg); return 0;int main() list = newcodelist(); freopen(text.in, rt+, stdin);text.outwt+, stdout); yyparse(); print(list); fclose(stdin); fclose(stdout);在代码中,先定义一些头文件,extern int yylex(); extern int yyerror();这两个语句是必须的,引用全局变量是为了能够使用之前词法分析器所获取的词素。并且调用一个yyerror函数用来当发生错误时能够

14、报告错误。接着定义一些终结符号,比如说%token NUM。yacc规定每个终结符都有一个唯一的编号(token number)。当我们用上面的方式定义终结符时,终结符的编号由yacc内部决定,其编号规则是从257开始依次递增,每次加1。为了能够联合词法分析器和语法分析器,词法分析程序名字必须是yylex,调法分析程序向语法分析程序提供当前输入的单词符号。yylex提供给yyparse的不是终结符本身,而是终结符的编号,即token number,如果当前的终结符有语义值,yylex必须把它赋给yylval。 接着是翻译规则部分,这个翻译规则由一个文法产生式和一个相关联的语义动作组成,在这里在

15、每个生成式后边加上语法制导翻译以实现回填的功能。4. 另外编写一个头文件myyacc.h将其加入到myyacc.y文件中去文件如下所示:Myyacc.h#ifndef CP_H#define CP_H#include string.hmalloc.htypedef struct listele int instrno; struct listele *next;listele; listele* new_listele(int no) listele* p = (listele*)malloc(sizeof(listele); p-instrno = no;next = NULL; retur

16、n p;typedef struct instrlist listele *first,*last;instrlist; instrlist* new_instrlist(int instrno) instrlist* p = (instrlist*)malloc(sizeof(instrlist);first = p-last = new_listele(instrno); instrlist* merge(instrlist *list1, instrlist *list2) instrlist *p; if (list1 = NULL) p = list2; else if (list2

17、!=NULL) if (list1-last = NULL) list1-first = list2-first;last =list2-last; else list1-last-next = list2- list2-last = NULL; free(list2); p = list1; typedef struct node instrlist *truelist, *falselist, *nextlist; char addr256; char lexeme256; char oper3; int instr;node; int filloperator(node *dst, ch

18、ar *src) strcpy(dst-oper, src); return 0; int filllexeme(node *dst, char *yytext)lexeme, yytext); int copyaddr(node *dst, char *src)addr, src); int new_temp(node *dst, int index) sprintf(dst-addr, t%d, index); int copyaddr_fromnode(node *dst, node src)addr, src.addr);typedef struct codelist int line

19、cnt, capacity; int temp_index; char *code;codelist; codelist* newcodelist() codelist* p = (codelist*)malloc(sizeof(codelist);linecnt = 0;capacity = 1024;temp_index = 0;code = (char*)malloc(sizeof(char*)*1024); int get_temp_index(codelist* dst) return dst-temp_index+; int nextinstr(codelist *dst) ret

20、urn dst-linecnt; int Gen(codelist *dst, char *str) if (dst-linecnt = dst-capacity) dst-capacity += 1024;code = (char*)realloc(dst-code, sizeof(char*)*dst-capacity); if (dst-code = NULL) printf(short of memeoryn return 0; dst-codedst-linecnt = (char*)malloc(strlen(str)+20);linecnt, str);linecnt+; cha

21、r tmp1024; int gen_goto_blank(codelist *dst) sprintf(tmp, goto Gen(dst, tmp); int gen_goto(codelist *dst, int instrno)goto %d, instrno); int gen_if(codelist *dst, node left, char* op, node right)if %s %s %s goto, left.addr, op, right.addr); int gen_1addr(codelist *dst, node left, char* op)%s %s, left.addr, op); int gen_2addr(codelist *dst, node left, char* op, node right)%s = %s %s Gen(dst, tmp

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1