还剩11页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
《编译原理》课程设计报告姓名____________________________学号____________________班级:_________________________________专业____________________指导教师_______________________时间_____________________项目名称贵州大学计算机科学与信息学院$$-tc=nxq;$$-fc=nxq+l;emitj,$l,$3JT;emit“j”,Cr;}”,$|expr Vexpr{emit1,$3JOemit“jJO;}|expr expr{emit”j”,$l,$3JT;emitjdJr;}%%void backpatchintchain,int quadinti;char string!64];for i=0;iline+1;i++if code[i].no==chainitoaquad,string,10;code[chain].res=strdupstring;}void emitchar*coml,char*com2,char*com3,char*com4code[line].no=nxq;code[line].op=strdupcoml;code[line].argl=strdupcom2;code[line].arg2=strdupcom3;code[line].res=strdupcom4;line++;nxq++;char*newtempstatic intno=1;char*s;s=char*mallocsizeofchar*10;sprintfs,nt%dn,no;no++;return s;mainint i;yyparse;fori=0;iline;i++printfn%d%s,%s,%s,%s\nn,code[i].no,code[i].op,code[i].argl,code[i].arg2,code[i].res;里添加的语法规则如下:mylexer.l%#include syntax.h#include math.h#include stdlib.h#include string.h%%[]|[1-9][0-9]*{yylval.text=strdupyytext;return NUMBER;}while{return WHILE;}nir{return IF;}[A-Za-z][A-Za-zO-9]*{yylval.text=strdupyytext;return NAME;}{return0;}{return yytext[O];}%%
3.4程序结果截图如下:口J E:\编译原理愧译原理课程设计11l\bi anyi\De bu g\statem ent.exeHwhileaba=d+r*r/t100j,a,b,00102*,r,r,tl104+,d,t2,t3105=,t3,_,a_____106J100Press anykey tocontinuewhilea=gifcdd=q*r+f/g100j,a,g,00102j,c,d,0103j0105/,£,g,t2106+,tl,t2,t3107=,t3,_,d108j,_,_,-842150451______109j100Press anykey tocontinue.
四、总结通过这次课程设计,让我对编译原理这门理论性很强的课程有了更加深刻的理解,对语法分析和词法分析及中间代码的生成的原理更加透彻相当于对书本的知识又复习了一遍在做课程设计的时候也遇到了很多问题,但是在老师和同学的帮助下我最总完成了这次课程设计,但是这次课程设计还是存在不足,因为在写出语句的四元式的时候没有实现回填【1】编译原理陈意云张昱高等教育出版社
五、参考书目一・课程设计目的-------------------------------------------------2二.课程设计题目描述和要求--------------------------------------
21、选定的题目“一.一•一•一•一一——・一-―・一・———―
22、课程设计要求描述---------------------------------------
23、实现的功能描述-------------------------------------------
24、分析器的使用描述-----------------------------------------3三.课程设计实现描述--------------------------------------------
42、课程设计基本思路描述-----------------------------------
43、LR分析器基本原理描述-----------------------------------
54、代码描述-----------------------------------------------
55、演示分粕-----------------------------------------------11四.课程设计总结------------------------------------------------11五,参考书B-----------------------------------------11
一、课程设计目的课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节通常,设计题中的问题比平时的练习题要复杂,也更接近实际编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力
二、课程设计题目描述和要求
1.1选定的题目基本语句的语法分析程序设计
2.2课程设计的要求描述要求:每个同学在所给的题目课程设计
一、
二、三中自选一个实现学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写设计时间第周周181开发工具环境下使用1Windows TurboC;环境下使用2Windows VisualC++其它熟悉语言
32.3课程设计的内容描述
2.
3.1设计题一算术表达式的语法分析及语义分析程序设计目的通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析设计内容及要求算术表达式的文法〈无符号整数〉=〈数字〉{〈数字〉}〈标识符〉=〈字母〉{〈字母〉〈数字〉}I〈表达式〉=〈项〉{〈加法运算符〉〈项〉}〈项〉::=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉=〈标志符〉〈无符号整数〉I〈加法运算符〉=+I-〈乘法运算符〉=*I/〈字母〉=a Ib|…|z〈数字〉=0|1|…|9要求()在递归下降法、、算符优先分析法或者法中选择其中一种方法完成1LL1LR以上任务,中间代码选用四元式()编制分析程序,设计若干用例,并上机测试2()书写课程设计报告
32.
3.2设计题二布尔表达式的语法分析及语义分析程序设计目的通过设计、编制、调试一个布尔表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析设计内容及要求布尔表达式的文法〈无符号整数〉=〈数字〉{〈数字〉}〈标识符〉=〈字母〉{〈字母〉〈数字〉}I〈表达式〉=〈项〉{〈逻辑运算符〉〈项〉}〈项〉=〈因子〉{〈关系运算符〉〈因子〉}〈因子〉=〈标志符〉〈无符号整数〉I〈逻辑运算符〉=AND〈乘法运算符〉=〈〈二!二I=I II=I〈字母〉=a|b|…|z〈数字〉=0|1|…|9要求()在递归下降法、()、算符优先分析法或者法中选择其中一种方法完1LL1LR成以上任务,中间代码选用四元式
(2)编制分析程序,设计若干用例,并上机测试
(3)书写课程设计报告
2.
3.3设计题三程序基本语句的语法分析程序设计目的通过设计、编制、调试词法及语法分析程序,加深对词法及语法分析原理的理解设计内容及要求基本语句()S whileC S;一();if CSi elseS2id=E;{}S其中为变量,变量名满足由字母、数字构成,并且由字母开头的字符串构成
(1)id
(2)运算中的数全部是无符号整型数据;
(3)表达式E中的运算符只有+和-;()关系运算表达式中的运算符只涉及二(相等)和!二(不等)并且在一4C个关系运算中只涉及其中的一个运算要求
(1)在递归下降法、LL
(1)或者LR法中选择其中一种方法完成以上任务()编制分析程序,设计若干用例,并上机测试2书写课程设计报告
32.
3.4yacc语言的语法规则的简单描述任何一个高级语言都需要有一个编译程序或解释程序,目的是将高级语言的源程序翻译成能被机器识别的目标程序,编译程序所要完成的工作通常划分为词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等阶段,编译程序的编制是一个非常复杂的过程,为了减轻编译程序设计人员的工作量随着软件开发自动化技术的提高,出现了一些编译程序的构造工具就是一个语法分析程序的自YACC动产生器可以处理用文法表示的上下文无关语言,的全称是LALRl YACCYet Another另一种编译程序的编译程序是年由开发的,它接受Compiler Compiler1975Johnson一个用描述的上下文无关语言的语法规则自动生成BNF分析器可与词法分析器联合使用借助完成词法分析LALRl yyparse,YACC LEXLEX的任务并在源程序中调用YACC yylexO,的工作示意图如图所示,YACC1YACC源程序VYACC语法分析输入串单词符号串4的输出—词法分析程序终结符一语法分析程序vylcx vvparse图1YACC示意图源程序可分为三个部分格式为YACC说明部分%%语法规则部分%%程序段部分说明部分用来定义语法规则中要用的终结符号、语义动作中使用的数据类型、变量以及语法规则中运算符的优先级等语法规则部分用来定义所要处理的语言的语法规则以及相应的语义动作格式为非终结符:替换规则{语义动作};其中替换规则是由终结符和非终结符组成的字符串语义动作用语言来书写对于左C部非终结符相同的语法规则可将它们集中在一起规则间用分隔,最后一条规则之“I”后才用分号程序段部分主要包括主程序、错误信息执行程序、词法分析程序main yyerror、用户在语义动作中用到的子程序等yylexO
三、课程设计实现描述
3.1实现平台Windous7Visual studio
20103.2课程设计的基本思路描述循环语句的文法描述while Sf WdS⑴WE Wf while的语句的文法描述if S—CS⑴C fifE S-TpS2TP fCS1;else我们用的创建一个工程,如下图所示,Parser GeneratorProject—Parser Wizard注意红圈部分的设置ParserWizard-Step1』Name0Directory归入编释原理\Eompiler2012・・・|ParserWizard-Step2Target languageCompiler|Microsoft VisualC++~~32-bit▼|B|QD|〈上一步下一步_取消|然后选择默认文件模板如下:YACC and Lex file,Filesy YACCandLex fileC YACC file only「Lex fileonly“Create mainfunctionUse compacttablesGenerate Unicodeparser/lexical analyse!suo=dolodModel SingleI00|I上一步下一步取消其余按默认完成即可:rParserWizard-Step3of4YACCfilename Parsername|myparserParser|Lookahead LR一ParserWizard-Step4of4Lex filename Lexicalanalyser naiTie|mylexer<上一步⑻|完成|取消这时,我们可以看到帮我们自动生成了一个文件和文件,Parser Generatormyparser.y mylexer.1语法规则就可以在这两个文件里面添加了图myparser.y国mylexer.l次-X{/**«*|/**«*«*«*«««**«*«««««**««**«*««****«««*««*«««****«««****«*«««*«««**«»««*«»«*«mypaiParse mylexer.1ParserWizard generatedLexfile.Date:Date:2012年6月30日**************«*****»*******»******»**«*»**********«***************«*«*«***«z#includemyparser.h关头关头予*%}#incl%}//place anydeclarations here///////de//at^mcl//declarations section#if nc添加的语法规则分别如下:#def i#endi卜[|//rules section里添加的语法规则如下:myparser.y%o#include struct.h#include stdlib.h#include string.hint nxq=100;int line=0;char string
[64];void backpatchint,int;void emitchar*,char*,char*,char*;char^newtempO;%%union{char*text;struct wdattri*wdas;struct eattri*eas;%token WHILE%token IF%token textNUMBER%token textNAME%left%left%type textexpr%type wdass%type wdaswd%type wdaswf%type easbexpr%type wdasw%type wdasassigns%:%wd s{backpatch$2-chain,$l-quad;itoa$l-quad,string,10;emitjstring;$$・chain=$l-quad;}|wf s{backpatch$2-chain,$l-quad;itoa$1-quad,string,l0;,emit string;}|assign{$$=struct wdattri*mallocsizeofstruct wdattri;$$-chain=$l-chain;}*w:WHILE{$$=struct wdattri*mallocsizeofstruct wdattri;$$-quad=nxq;}wd:w**bexpr7{backpatch$3-tc,nxq;$$=struct wdattri*mallocsizeofstruct wdattri;$$-chain=$3-fc;$$-quad=$l-quad;}wf:IF Xbexpr{backpatch$3-tc,nxq;$$=struct wdattri*mallocsizeofstruct wdattri;$$-chain=$3-fc;assign:NAME eDr{emit,=,\$3,_,\$1;$$-chain=nxq;}expr:exprexpr{$$=newtemp;emitn+n,$1,$3,$$;}|expr expr{$$=newtemp;emit-,$l,$3,$$;}阳|expr expr{$$=newtemp;emit*”,$l,$3,$$;}{$$=newtemp emit/,$l,$3,$$;}|exprexpr{$$=$1;INUMBER{$$=$1;|NAME*{$$=struct eattri^mallocsizeofstruct eattri;bexpr:expr expr。