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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(编译原理课程设计Pascal语言词法语法分析器设计.docx)为本站会员(b****0)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

编译原理课程设计Pascal语言词法语法分析器设计.docx

1、编译原理课程设计Pascal语言词法语法分析器设计编译原理课程设计题 目: Pascal语言词法、语法分析器设计 姓 名: 学 院: 专 业: 班 级: 学 号: 指导教师: 职称: 副教授 2014 年06月09日南京农业大学教务处制附录1.程序清单 2. 测试报告Pascal语言词法、语法分析器设计1 实验设计编译程序是现代运算机系统的大体组成部份之一,而且多数运算机系统都配有不止一个高级语言的编译程序,对有些高级语言乃至配置了几个性能不同的编译程序。1为了能够更好地把握编译原理的大体理论和编译程序构造的大体方式及技术,通过对Pascal语言词法、语法分析器的设计,关于提高我小组设计的能力

2、,加深对编译理论知识的明白得与应用有很重要的作用。1.1 系统整体框架主程序语法分析程序词法分析程序图1:系统整体框架1.2 实验目的1)完成词法分析器并通过测试;2)完成语法分析器并通过测试。3)利用九组测试文件对程序进行测试并撰写测试报告,完成实验报告。1.3系统设计构思PL/0语言的编译进程采纳一趟扫描方式,以语法语义分析程序为核心,词法分析程序和代码生成程序都作为一个独立的进程,当语法分析需要读单词时就挪用词法分析程序,当语法分析程序需要生成中间代码时就挪用代码生成程序。另外用表格治理程序成立标量、常量和进程标识符的说明与引用之间的信息联系。用犯错处置程序对词法和语法分析碰到的错误给出

3、在源程序中犯错的位置和性质1。本小组所设计词法分析与语法分析器,参考了PL/0编译器的设计思路。与PL/0编译器不同的是,表格治理程序与犯错处置程序被综合在语法分析程序中,且缺少中间代码的说明执行程序。词法分析器每读到一个单词都会执行入单词表操作enterWordtable()操作,并给出单词的属性,值和id号,以备后面输出词法分析结果。语法分析器挪用词法分析器获取一个单词以后,分析单词的类别。若是是标识符那么需要挪用表格治理程序的positon()函数,查看此单词在table表中位置。若是语法分析器当前分析的语句是变量声明或常量声明或进程声明,且标识符在table中已存在那么转犯错处置eor

4、ror(),不然,若是是常量、变量或进程名引用且标识符在table表中不存在那么转犯错处置error()。若是语法分析概念产生式有一条匹配,那么立刻进行规约,并执行相应的操作,如入表操作,查表操作,犯错处置,中间代码生成和输出当前所匹配产生式等。其中代码生成处置程序并无作为一个单独的模块进行设计,而是穿插在语法分析程序中,以方便挪用。同时,将中间代码记录在代码表code中,其中当前所生成的代码在code表中寄存的位置由cx指针决定。2 词法分析程序词法分析器相对来讲比较简单,作为一个独立子程序词法分析是编译进程中的一个时期,在语法分析前进行。2.1 模块设计Lex的输入文件分为三个时期,说明部

5、份、识别规那么、辅助进程。说明部份中line表示行数,nchar表示字符个数,nword表示单词数。int yywrad(void)是系统里面自带的函数。void yyerror(char *)是报错函数。enum identkindconstant,variable,procedure是标识符类型,分为常量,变量和进程三种。char keyword1320是用一个数组概念关键字,int id13概念标识符,typedef struct node概念一个单词数组char name20是单词名字,char sym20是对应的标识符,int id是对应的标识符号,int num是对应的数值。wor

6、dType wordTable200是一个单词表,寄存输入的单词,void enterWordtable(char *,int,int)表示单词进表。digit 0-9是数字,letter a-zA-Z是字母,num 1-9(digit)*|0是数值,ident _A-Za-z(_A-Za-z|0-9)*是字母或下划线开头的标识符unlegalident 0-9ident是不合法的标识符。标识部份中概念了关键字,如 t;空格,n line+; nchar+;换行。constnchar+=yyleng;enterWordtable(SYM_const,SYM_const,-1);常量,每读到一个

7、关键字的字符,单词的长度就加一,所读到的字符就进入单词表存起来;,-1表示不输出。运算符,如= nchar+; enterWordtable(OPR_become,OPR_become,-1);return OPR_become;等号。边界符(nchar+;enterWordtable(BDY_lparen,BDY_lparen,-1); return BDY_lparen;左括号。ident是把识别到的标识符独到单词表里去,num是返回对应的数值,unlegalident如果词法分析上不通过,就会报错。辅助进程中void enterWordtable(char *sym,int id,int

8、 num)是单词进表,参数别离表示标识符,id号和数值。void listWordtable()表示输出单词表。int yywrap(void)是系统自带的,读到文件最后返回1,void setInputDirect(FILE *input)是读文件。int yygetchar(void)是获取字符。2.2 具体功能设计1)说明部份:#include stdio.h /头文件#include string.h /头文件#include malloc.h /头文件#include windows.h /头文件#include myyacc_table.h /头文件int line=1; /统计行

9、数int nchar=0; /统计字符数int nword=0; /统计单词数int yywrap(void); /约束,返回1表示扫描后程序终止,不然返回0void yyerror(char *); /typedef struct node char name20; char sym20; int id; int num; wordType;wordType wordTable200; /单词表数组void enterWordtable(char *,int,int); /入表函数说明digit 0-9 /无符号整数letter a-zA-Z /标识符num 1-9(digit)*|0 id

10、ent _A-Za-z(_A-Za-z|0-9)*unlegalident 0-9ident /不合法的标识符2)识别规那么:constnchar+=yyleng; enterWordtable(SYM_const,SYM_const,-1); return SYM_const;/以此为例,若是显现const那么统计字符个数的加上显现单词长度,并进入单词表,由于为保留字不输出数值,返回。ident nchar+=yyleng; yylval.ident=(char *)malloc(strlen(yytext)+1); strcpy(yylval.ident,yytext); enterWor

11、dtable(SYM_ident,SYM_ident,-1); return SYM_ident; /以此为例,显现标识符那么统计字符个数的加上显现单词长度,同时;利用malloc函数分派存储空间同时注意有个串终止符因此加1。以后进行拷贝并进入单词表,由于为标识符不输出数值,返回。3)辅助进程:void enterWordtable(char *sym,int id,int num)/进入单词表void listWordtable() /输出词法分析结果int yywrap(void) /约束,返回1表示扫描后程序终止,不然返回0int yygetchar(void) /取得键盘输入3 语法分

12、析程序语法分析器是进行语法检查、并构建由输入的单词组成的数据结构。通常利用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入。3.1 流程图设计开始打开文件fileopen()关闭文件fileclose()结束调用语法分析过程输出?错误判断?输出过程等YN图3:语法分析器流程图词法分析语法分析器流程主若是main函数的前提,依照流程图的操作对main函数进行书写。由于全数写入main函数,代码过于冗杂,将部份函数,例如打开文件,关闭文件,错误检测单独列出来,减少main函数代码量。程序开始后先打开文件,如此才能进行写入工作,以后判定文件是不是打开成功,不成功继续打开

13、。成功以后进行判定是不是进行输出,如此有助于快速查看结果。判定终止后就开始对测试文件进行判定,是不是符合语法,输出结果,终止程序。3.2 模块设计说明部份包括了YACC需要用来成立分析程序的有关记号、数据类型和文法规那么的信息。它还包括了必需在它的开始时直接进入输入文件的任何C代码,主若是其他源代码文件的#include指示。包括头文件表、全局变量reducecount、listreduce和printReduce函数说明。以后开始概念符号、语义值,概念终结符,概念结合性(采纳左结合)。规那么部份包括修改的BNF格式的文法规那么,和将在识别出识别出相关的文法规那么时被执行的C代码中的动作。例如

14、规那么:=,当知足那个条件时就进行动作,输出那个进程。依照PL/0语言文法的EBNF表示,进行规那么说明包括::=:=program分号:=:=:=:=const,,:=:=:=var:=;进程说明部份:=procedure,:=|:=:=+|-:=*|/:=|():=ifthen:=:=|#|:=whiledo:=call:=read():=,:=,:=write():=beginend:=;end。程序部份包括词法分析子程序yylex()(利用LEX生成),语义动作子程序,犯错处置子程序yyerror(),加上打开文件、关闭文件、输出进程函数。3.3 具体功能设计1)说明部份:#inclu

15、de code.h /头文件#includewindows.h /头文件int reducecount=1; /规约计数器,利用该全局变量为规约进程编号排序int listreduce=0; /判定,为0时不输出规约进程,为1时输出规约进程int listwordtable=0; /判定,为0时不输出单词表,为1时输出单词表void printReduce(char *s); /函数声明unionchar *ident;int number; /保留数值 start program /必需以非终结符program开头token SYM_program /以此为例概念终结符left SYM_pl

16、us /概念结合性为左结合,加法2)规那么部份:program: programstart programblock printReduce(program-programstart programblock);/以此为例若是符合:=规约那么执行动作输出规约进程。3)程序部份:void printReduce(char *s) /若是listreduce=1,输出规约进程yyerror(char *s) /输犯错误个数及行数void fileopen() /先打开要写入文件,再打开输入的测试文件void fileclose() /关闭文件void canList() /界面void main(

17、void) /主函数,用来挪用其他函数4结果及测试4.1 总程序,程序开始后先打开文件,如此才能进行写入工作,以后判定文件是不是打开成功,不成功继续打开。成功以后进行判定是不是进行输出,如此有助于快速查看结果。判定终止后就开始对测试文件进行判定,是不是符合语法在这当中挪用table.h和词法分析,分析以后不管是不是符合语法要求都输出结果,若是符合语法那么输出通过windows自带变色函数输出绿色符合字样,输出以后返回白色终止程序;不然利用变色函数输出红色错误字样,而且标犯错误位置和错误数量,以后返回白色,终止程序。语法分析里的position函数在table.h中概念,用来判定位置。4.2 测

18、试平台测试平台:联想 idealpad操作系统: Windows 7 旗舰版 64位处置器: Intel(R) Core(TM)i3-2350M CPU 2.30 GHz内存:4.00G4.3测试案例program pro;const a:=10;var b,c;procedure p;begin c:=b+a;end;begin read(b); while b#0 do begin call p; write(2*c); read(b); end;end;4.4 测试进程及结果图:开始界面图:测试完成界面部份一图:测试完成界面部份二图:测试完成界面部份三图:测试完成界面部份四图:测试完成界

19、面部份五图:测试完成界面部份六图:测试完成界面中间代码4.5 测试分析表1:九组测试案例测试结果及分析编号错误个数错误行数错误类型分析10无错误无错误符合语法分析21Line4重复定义b,c重复定义了不符合语法31Line5没有定义b,c没有定义不符合语法41Line2超出范围a=1000000000超出int范围3276851Line6定义变量名使用关键字Read为关键字不能被定义为变量61Line6赋值号左边出现常量A为常量不能出现赋值号左边应为一个变量71Line12Call语句Call后面应该接一个过程而b是一个变量81Line9ReadRead后面应该接一个变量而p是一个过程91Li

20、ne6表达式表达式中标示符的属性应该为变量、常量、数字而p是一个过程通过九组测试案例的测试,咱们小组将语法分析的一些情形考虑完善,当符合语法时能正确判定,同时能识别出以上列举出的多种错误,可是当关键字被概念成变量名时(var read,b,c;)的错误尽管能检测出来可是事实上是默许成了进行read语句,这一点尚未完善。整体来讲,程序运行情形良好。5 总结5.1 不足1)咱们小组本来打算进行中间代码的生成,可是由于自身能力不足和对知识把握得不够严谨没能在规按时刻内完成中间代码的生成,没能使咱们的代码加倍的完善;2)当关键字被概念成变量名时(例如:var read,b,c;)的错误尽管能检测出来可

21、是事实上是默许成了进行read语句,这一点尚未完善。5.2 心得5.3 分工参考文献:1张素琴,吕映芝,蒋维社,戴桂兰.编译原理(第2版)M . 北京:清华大学出版社,200程序清单:mylex.l/*词法分析器*/%#include stdio.h#include malloc.h#include windows.h#include myyacc_table.hint line=1;int nchar=0;int nword=0;extern FILE *fa1;int yywrap(void);void yyerror(char *);enum identkindconstant,vari

22、able,procedure;char keyword1320= const, procedure, begin, end, write, read, do, call, while, if, then, program, var ;typedef struct node char name20; char sym20; int id; int num; wordType;wordType wordTable200;void enterWordtable(char *,int,int);%digit 0-9letter a-zA-Znum 1-9(digit)*|0ident _A-Za-z(

23、_A-Za-z|0-9)*unlegalident 0-9ident% t ;n line+; nchar+;const nchar+=yyleng; enterWordtable(SYM_const,SYM_const,-1); return SYM_const;procedure nchar+=yyleng; enterWordtable(SYM_procedure,SYM_procedure,-1);return SYM_procedure;begin nchar+=yyleng; enterWordtable(SYM_begin,SYM_begin,-1); return SYM_be

24、gin;end nchar+=yyleng; enterWordtable(SYM_end,SYM_end,-1); return SYM_end;write nchar+=yyleng; enterWordtable(SYM_write,SYM_write,-1); return SYM_write;read nchar+=yyleng; enterWordtable(SYM_read,SYM_read,-1); return SYM_read;do nchar+=yyleng; enterWordtable(SYM_do,SYM_do,-1); return SYM_do;call nch

25、ar+=yyleng; enterWordtable(SYM_call,SYM_call,-1); return SYM_call;while nchar+=yyleng; enterWordtable(SYM_while,SYM_while,-1); return SYM_while;if nchar+=yyleng; enterWordtable(SYM_if,SYM_if,-1); return SYM_if;then nchar+=yyleng; enterWordtable(SYM_then,SYM_then,-1); return SYM_then;program nchar+=y

26、yleng; enterWordtable(SYM_program,SYM_program,-1); return SYM_program;var nchar+=yyleng; enterWordtable(SYM_var,SYM_var,-1); return SYM_var;:= nchar+=2; enterWordtable(OPR_become,OPR_become,-1); return OPR_become;+ nchar+; enterWordtable(OPR_plus,OPR_plus,-1); return OPR_plus;- nchar+; enterWordtabl

27、e(OPR_minus,OPR_minus,-1); return OPR_minus;* nchar+; enterWordtable(OPR_times,OPR_times,-1); return OPR_times;/ nchar+; enterWordtable(OPR_slash,OPR_slash,-1); return OPR_slash; nchar+; enterWordtable(OPR_lss,OPR_lss,-1); return OPR_lss; nchar+; enterWordtable(OPR_gtr,OPR_gtr,-1); return OPR_gtr;= nchar+=2; enterWordtable(OPR_geq,OPR_geq,-1); return OPR_geq;!= nchar+=2; enterWordtable(O

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2