编译原理课程设计报告(共24页)

上传人:20****08 文档编号:61286489 上传时间:2022-03-11 格式:DOC 页数:24 大小:145KB
收藏 版权申诉 举报 下载
编译原理课程设计报告(共24页)_第1页
第1页 / 共24页
编译原理课程设计报告(共24页)_第2页
第2页 / 共24页
编译原理课程设计报告(共24页)_第3页
第3页 / 共24页
资源描述:

《编译原理课程设计报告(共24页)》由会员分享,可在线阅读,更多相关《编译原理课程设计报告(共24页)(24页珍藏版)》请在装配图网上搜索。

1、精选优质文档-倾情为你奉上编译原理课程设计报告 实验1:用Lex设计词法分析器1实验目的:学会用lex设计一个词法分析器。实验内容:使用lex为下述文法语言写一个词法分析器。实验要求:输入为用该语言所写的源程序文件;输出为记号序列,每个记号显示为二元组(记号名,记号属性值)的形式。输出可以在屏幕上,也可以输出到文件中。不要求建立符号表。在cygwin下用flex和gcc工具将实验调试通过,并能通过例子parser0中testcases目录下的test1.p测试例的测试。实验参考:exam1.l和exam2.l。语言文法: PROGRAM ; BEGIN END. VAR ;: | : ; IN

2、TEGER | REAL | , | ; | | | := IF THEN ELSE WHILE DO BEGIN END | + | - | * | / | | () | | | | . | . | | =| A | B | | X | Y | Z | a | b | | x | y | z0|1|2|9程序代码:%#include #define LT1#defineLE2#define GT3#defineGE4#defineEQ5#define NE6#define PROGRAM 7#define END13#define VAR9#define IF10#define THEN 1

3、1#define ELSE 12#define WHILE18#defineDO19#define ID 20#define NUMBER 21#define RELOP 22#define NEWLINE 23#define ERRORCHAR 24%delim t nwsdelim+letter A-Za-zdigit 0-9id_|letter(letter|digit)*numberdigit+(.digit+)?(E+-?digit+)?int1 digit|digitint1*/%s COMMENT%/*BEGIN COMMENT;ECHO;*/BEGIN INITIAL;ECHO

4、;.|nECHO; /* ECHO是一个宏,相当于 fprintf(yyout, %s, yytext)*/ws ;whilereturn (WHILE);do return (DO);PROGRAM return (PROGRAM);end return (END);VAR return (VAR);if return (IF);then return (THEN);else return (ELSE);id return (ID);number return (NUMBER); return (RELOP);= return (RELOP);= return (RELOP); return

5、 (RELOP); return (RELOP);= return (RELOP);+ return (RELOP);- return (RELOP);* return (RELOP);/ return (RELOP);:= return (RELOP); return (RELOP);. return (RELOP);, return (RELOP);.return ERRORCHAR;%int yywrap () return 1;void writeout(int c) switch(c) case ERRORCHAR: fprintf(yyout, (ERRORCHAR, %s) ,

6、yytext);break; case RELOP: fprintf(yyout, (RELOP, %s) , yytext);break; case WHILE: fprintf(yyout, (WHILE, %s) , yytext);break; case DO: fprintf(yyout, (DO, %s) , yytext);break; case NUMBER: fprintf(yyout, (NUM, %s) , yytext);break; case ID: fprintf(yyout, (ID, %s) , yytext);break; case NEWLINE: fpri

7、ntf(yyout, n);break; case PROGRAM: fprintf(yyout, (PROGRAM, %s) , yytext);break; case END: fprintf(yyout, (END, %s) , yytext);break; case VAR: fprintf(yyout, (VAR, %s) , yytext);break; case IF: fprintf(yyout, (IF, %s) , yytext);break; case THEN: fprintf(yyout, (THEN, %s) , yytext);break; case ELSE:

8、fprintf(yyout, (ELSE, %s) , yytext);break; default:break; return;int main (int argc, char * argv)int c,j=0;if (argc=2) if (yyin = fopen(argv1, r) = NULL) printf(Cant open file %sn, argv1); return 1; if (argc=3) yyout=fopen(argv2, w); while (c = yylex()writeout(c);j+;if (j%5 = 0) writeout(NEWLINE);if

9、(argc=2) fclose(yyin); if (argc=3) fclose(yyout);return 0;测试文件为Test1.p:PROGRAM test;VAR i, j, k: INTEGER; f0: REAL;BEGIN i := 1; j := 1; k := 0; f0 := 3.2; WHILE k=100 DO BEGIN IF j S or S | S and S | not S | (S) | true | false,其中优先级or and not,or 和 and 左结合,not 右结合。用非二义文法实现作为选作内容,非二义文法请参照表达式非二义文法自己写出

10、来。在cygwin下用flex,bison和gcc工具将实验调试通过,并写出测试例测试正确性。实验参考:calculator0-3这四个例子。程序代码:Cal.y文件:%int yylex(); #define YYSTYPE double /* 将Yacc栈定义为double类型 printf(nThe value of the expression is %lf.n, $1);*/%token NUM LPAREN RPAREN ENTER %left OR%left AND%right NOT%left PLUS MINUS%left TIMES DIVIDE%right UMINUS%

11、 /* 这样写prog可以让分析器每次读入一行进行分析,下一行重新分析expr */prog : prog exprp | exprp ;exprp : expr ENTER printf(1 表示 true;0 表示 false %lf.n, $1);shuchu($1); ;expr : expr PLUS expr$ = $1 + $3;| expr MINUS expr $ = $1 - $3;| expr TIMES expr $ = $1 * $3;| expr DIVIDE expr $ = $1 / $3;| LPAREN expr RPAREN $ = $2;| MINUS

12、expr $ = -$2;| NUM $ = $1; | expr OR expr $=panduan($1*$1+$3*$3); | expr AND expr $=panduan($1*$3); | NOT expr $=panduan2($2);%int main()yyparse();return 0;Cal.l文件:%#include cal.tab.h#include int yywrap(void) return 1;#define LT1#defineLE2#define GT3#defineGE4#defineEQ5#define NE6#define PROGRAM7#de

13、fine END13#define VAR9#define IF10#define THEN 11#define ELSE 12#define WHILE18#defineDO19#define ID 20#define RELOP 22#define NEWLINE 23#define ERRORCHAR 24%ws t+digit 0-9inumdigit+fnum digit*.digit+letterA-Za-zid_|letter(letter|digit)*%inum sscanf(yytext, %lf, &yylval); return NUM;fnumsscanf(yytex

14、t, %lf, &yylval); return NUM;+return PLUS;*return TIMES;-return MINUS;/return DIVIDE;(return LPAREN;)return RPAREN;or return OR;and return AND;not return NOT;return LT;return GT;=return GE;= return EQ;!= return NQ;:= return FZ;ws;nreturn ENTER;. printf(nLEX:ERROR! c=%sn, yytext);/*BEGIN COMMENT;ECHO

15、;*/BEGIN INITIAL;ECHO;whilereturn (WHILE);do return (DO);PROGRAM return (PROGRAM);end return (END);VAR return (VAR);if return (IF);then return (THEN);else return (ELSE);id return (ID);%int panduan(double a)if(a!=0) a=1;return a;int panduan2(double a)if(a=0) a=1;else if(a!=0) a=0;return a;int shuchu(

16、double a)if(a=0)printf(false);else if (a!=0)printf(true);return 1;运行程序:实验4:用Yacc设计语法分析器1实验目的:学习如何使用Yacc设计一个语法分析器,并与用lex写的词法分析器链接起来。实验内容:使用yacc为课程设计实验1所给的语言写一个语法分析器(你可以重新设计该语言的文法,但不能改变语言)。其中,词法分析使用课程设计实验2中已完成的词法分析器(即,你需要将本实验的语法分析器和实验2的词法分析器链接起来)。实验要求:输入为实验1所给语言写的源程序文件;输出为屏幕显示语法分析是否成功。在语法分析中不能出现任何的冲突(

17、移进-归约或归约-归约冲突),或者虽然有冲突,但是你能够说清楚冲突是如何解决的。在cygwin下用flex,bison和gcc工具将实验调试通过,并且你写的语法分析器至少应该能通过例子parser0中testcases目录下的test0.p和test1.p两个测试例的测试。实验参考:可以在例子parser0的基础上进行修改;如果你尚不能将实验2的词法分析器和本实验的语法分析器链接起来,可以暂时使用parser0给出的词法分析器(前提是你的语法分析器中终结符名的定义与parser0的相同)。程序代码:Cal.y%int yylex(); #define YYSTYPE double /* 将Ya

18、cc栈定义为double类型 printf(nThe value of the expression is %lf.n, $1);*/%token NUM LPAREN RPAREN ENTER %left OR%left AND%right NOT%left PLUS MINUS%left TIMES DIVIDE END%right UMINUS BEGIN VAR %nonassoc PROGRAM%union int inum; double fnum; char * id;% /* 这样写prog可以让分析器每次读入一行进行分析,下一行重新分析expr prog : prog exp

19、rp | exprp ;exprp : expr ENTER printf(1 表示 true;0 表示 false %lf.n, $1);shuchu($1); ;expr : expr PLUS expr$ = $1 + $3;| expr MINUS expr $ = $1 - $3;| expr TIMES expr $ = $1 * $3;| expr DIVIDE expr $ = $1 / $3;| LPAREN expr RPAREN $ = $2;| MINUS expr $ = -$2;| NUM $ = $1; | expr OR expr $=panduan($1*$1

20、+$3*$3); | expr AND expr $=panduan($1*$3); | NOT expr $=panduan2($2);*/prog : PROGRAM biaoshifu fenpro |fenpro |biaoshifu ;biaoshifu:ID ;fenpro :blsm BEGIN yjb END |blsm printf(BEGIN n ); |yjb printf(END n); ;blsm: VAR blsmb printf(VAR); |blsmb ;blsmb:blb MH leixing |blb MH leixing blsmb |blb |leixi

21、ng ;leixing:INTEGER printf(INTEGER); |REAL printf(REAL); ;blb:bl$ = $1; |bl DH blb ;bl:NUM $ = $1; ;yjb:yj |yj yjb ;yj:fzyj |tjyj |whileyj |fhyj ;fzyj:bl FZ bds $ = $3; |bl |bds ;bds:guanxi $ = $1; |suanshu $ = $1; ;tjyj:IF guanxi THEN yj ELSE yj |guanxi |yj ;whileyj:WHILE guanxi DO yj printf(WHILE)

22、; |guanxiprintf(DO); |yj ;fhyj:BEGIN yjb ENDprintf(BEGIN); |yjb printf(END); ;suanshu:xiang |suanshu PLUS suanshu $ = $1 + $3; |suanshu MINUS xiang$ = $1 - $3; ;xiang:yinshi |xiang*yinshi$ = $1 * $3; |xinag/yinshi$ = $1 / $3; ;yinshi:bl$ = $1; |NUM$ = $1; |LPAREN suanshu RPAREN $ = $2; ;guanxi:suans

23、hu LT suanshu $=bijiao1($1,$3); |suanshu GT suanshu $=bijiao2($1,$3); |suanshu LQ suanshu $=bijiao3($1,$3); |suanshu GQ suanshu $=bijiao4($1,$3); |suanshu EQ suanshu $=bijiao5($1,$3); |suanshu NQ suanshu $=bijiao6($1,$3); ;%int main()yyparse();return 0;Cal.l%#include cal.tab.h#include int yywrap(voi

24、d) return 1;#define LT1#defineLE2#define GT3#defineGE4#defineEQ5#define NE6#define IF10#define THEN 11#define ELSE 12#define WHILE18#defineDO19#define ID 20#define RELOP 22#define NEWLINE 23#define ERRORCHAR 24%ws t+digit 0-9inumdigit+fnum digit*.digit+letterA-Za-zid_|letter(letter|digit)*%s COMMENT

25、%inum sscanf(yytext, %lf, &yylval); return INUM;fnumsscanf(yytext, %lf, &yylval); return FNUM;+return PLUS;*return TIMES;-return MINUS;/return DIVIDE;(return LPAREN;)return RPAREN;or return OR;and return AND;not return NOT;return LT;return GT;=return GE;= return EQ;!= return NQ;:= return FZ;: return

26、 MH;, return DH; teturn FH;ws;nreturn ENTER;. printf(nLEX:ERROR! c=%sn, yytext);/*BEGIN COMMENT;ECHO;*/BEGIN INITIAL;ECHO;whilereturn (WHILE);do return (DO);PROGRAM return (PROGRAM);end return (END);VAR return (VAR);if return (IF);then return (THEN);else return (ELSE);id return (ID);%int panduan(dou

27、ble a)if(a!=0) a=1;return a;int panduan2(double a)if(a=0) a=1;else if(a!=0) a=0;return a;int shuchu(double a)if(a=0)printf(false);else if (a!=0)printf(true);return 1;int bijiao1(double a,double b)if(ab)return 1;else return -1;int bijiao3(double a,double b)if(a=b)return 1;else return -1;int bijiao5(d

28、ouble a,double b)if(a=b)return 1;else return -1;int bijiao6(double a,double b)if(a!=b)return 1;else return -1;实验5:用Yacc设计语法分析器2实验目的:学习如何使用Lex和Yacc设计一个语法分析器,并学习如何在语法分析的同时生成分析树。实验内容:修改实验4,给产生式加上动作,动作为生成一棵语法分析树。这棵分析树的结构可以使用或参照例子parser1中ast.h文件中定义的分析树结构。实验要求:输入为实验1所给语言写的源程序文件;输出为一棵语法分析树,这棵语法分析树的表示方法可以是这

29、样两种:1.将分析树的数据结构打印出来;2.按分析树的结构输出一个C语言源程序文件(即输入是所给语言的源程序文件,输出为语义相同的C语言源程序文件)。在cygwin下用flex,bison和gcc工具将实验调试通过,并且你写的语法分析器至少应该能通过例子parser1中testcases目录下的test0.p和test1.p两个测试例。实验参考:可以参考例子parser1或在它的基础上进行修改;如果你尚不能将实验2的词法分析器和本实验的语法分析器链接起来,可以暂时使用parser1给出的词法分析器(前提是你的语法分析器中终结符名的定义与parser1的相同)。你也可以在自己的语法分析器中直接使

30、用parser1已经提供的输出方式(打印分析树的数据结构),但前提是你必须使用parser1提供的分析树结构(ast.h)。程序代码:%#include #include ast.h /该文件定义了抽象语法树(分析树)的数据结构#include errormsg.h#define YYDEBUG 1 /* 允许跟踪错误,与%debug功能相同 */int yylex(void); /* function prototype */* 该函数显示错误信息s,显示时包含了错误发生的位置。*/void yyerror(char *s) EM_error(EM_tokPos, %s, s);/* 存放抽

31、象语法树中 程序 数据结构的变量 */a_prog program = NULL;% /* 定义属性值栈的类型,实验8需要修改此处 */%union int ival;double fval;string sval; a_exp exp; a_bexp bexp; a_stm_list stms; a_prog prog; a_dec_list decl; /* 定义各个终结符,以及他们的属性值的类型,实验8需要修改此处 */%token ID /* id */%token INT /*整型数*/%token FLOAT /*浮点数*/%token INTEGER REAL /*两种类型名:整

32、型、实型*/%token COMMA COLON SEMICOLON LPAREN RPAREN PERIOD /* 符号 , : ; ( ) . */ PROGRAM BEGINN END VAR IF WHILE DO /* 关键字:PROGRAM BEGIN END VAR IF WHILE Do */ THEN ELSE /* 关键字:THEN ELSE */ ASSIGN EQ NEQ LT LE GT GE /* 符号 := = = */ PLUS MINUS TIMES DIVIDE /* 符号 + = * / */%start program /* 定义各个非终结符的属性值类型

33、,实验8需要修改此处 */%type program%type bianliangbiao declist vardec%type fuhe xunhuan tiaojian fuzhi yuju stmts%type exp yinshi xiang suanshu %type guanxi%program:PROGRAM ID SEMICOLON vardec BEGINN stmts END PERIODprogram = A_Prog(EM_tokPos, $2, $4, $6);vardec : VAR declist $ = $2;declist : bianliangbiao C

34、OLON INTEGER SEMICOLON $ = A_DecList(A_VarDec(EM_tokPos, $1, T_int), NULL); | bianliangbiao COLON INTEGER SEMICOLON declist $ = A_DecList(A_VarDec(EM_tokPos, $1, T_int), $5); | bianliangbiao COLON REAL SEMICOLON $ = A_DecList(A_VarDec(EM_tokPos, $1, T_real), NULL); | bianliangbiao COLON REAL SEMICOL

35、ON declist $ = A_DecList(A_VarDec(EM_tokPos, $1, T_real), $5); bianliangbiao : ID $ = A_VarList(A_Id(EM_tokPos, $1), NULL); | ID COMMA bianliangbiao $ = A_VarList(A_Id(EM_tokPos, $1), $3); ; stmts : yuju $ = A_StmList($1,NULL); | yuju SEMICOLON stmts $ = A_StmList($1,$3); ;yuju : fuzhi $ = $1; | tia

36、ojian $ = $1; | xunhuan $ = $1; | fuhe $ = $1; ; fuzhi : ID ASSIGN suanshu$ = A_Assign(EM_tokPos, A_Id(EM_tokPos, $1), $3);tiaojian : IF guanxi THEN yuju ELSE yuju $ = A_If(EM_tokPos, $2, $4, $6); ;xunhuan : WHILE guanxi DO yuju $ = A_While(EM_tokPos, $2, $4); ; fuhe : BEGINN stmts END $ = A_Seq(EM_

37、tokPos, $2); ; suanshu : xiang $ = $1; | suanshu PLUS xiang $ = A_OpExp(EM_tokPos, A_plusOp, $1, $3); | suanshu MINUS xiang$ = A_OpExp(EM_tokPos, A_minusOp, $1, $3); ; xiang : yinshi $ = $1; | xiang TIMES yinshi $ = A_OpExp(EM_tokPos, A_timesOp, $1, $3); | xiang DIVIDE yinshi $ = A_OpExp(EM_tokPos,

38、A_divideOp, $1, $3); ; yinshi : ID $ =A_VarExp(EM_tokPos, $1); | INT$ = A_IntExp(EM_tokPos, $1); | FLOAT $ = A_RealExp(EM_tokPos, $1); ; /*EQ NEQ LT LE GT GE*/ guanxi : suanshu EQ suanshu$ = A_BExp(EM_tokPos, A_eqOp, $1, $3); | suanshu NEQ suanshu$ = A_BExp(EM_tokPos, A_neqOp, $1, $3); | suanshu LT suanshu$ = A_BExp(EM_tokPos, A_ltOp, $1, $3); | suanshu LE suanshu$ = A_BExp(EM_tokPos, A_leOp, $1, $3); | suanshu GT suanshu$ = A_BExp(EM_tokPos,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!