编译原理实验报告.docx
《编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告.docx(50页珍藏版)》请在咨信网上搜索。
1、编译原理实验报告软件131 陈万全 132852一、 需求分析通过对一个常用高级程序设计语言的简单语言子集编译系统中词法分析、语法分析、语义处理模块的设计、开发,掌握实际编译系统的核心结构、工作流程及其实现技术,获得分析、设计、实现编译程序等方面的实际操作能力,增强设计、编写和调试程序的能力。通过开源编译器分析、编译过程可视化等扩展实验,促进学生增强复杂系统分析、设计和实现能力,鼓励学生创新意识和能力。实验项目实 验 内 容1、词法分析程序设计与实现构造具有关键字、运算符、标识符、无符号常数等单词的词法分析程序。输入由符合及不符合规定单词类别结构的各类单词组成的源程序。输出单词串的二元式编码(
2、CLASS,VALUE)。2、语法分析程序设计与实现将词法分析程序输出的单词串作为输入,针对常见的表达式、赋值语句、条件语句、循环语句等语法成分,选择有代表性的语法分析方法,如递归下降法、算符优先分析、LL(1)、LR等方法之一,设计实现相应的语法分析程序。3、语义分析程序设计与实现对各语法单位增加语义子程序,将表达式或可执行语句翻译为四元式序列输出,并能进行错误检查与处理,将错误信息输出。1、 词法分析程序设计与实现假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单
3、词的词法分析程序。输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。2、 语法分析程序设计与实现选择对各种常见高级程序设计语言都较为通用的语法结构算术表达式的一个简化子集作为分析对象,根据如下描述其语法结构的BNF定义G2,任选一种学过的语法分析
4、方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。G2: | + | - | * | / | ()若将语法范畴、和分别用E、T、F和i代表,则G2可写成:G2E:E T | E+T | E-T T F | T*F | T/F F i | (E)输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID 输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。3、语义分析程序设计与实现对文法
5、G2中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。输入:包含测试用例(由标识符、无符号数和+、*、/、(、)构成的算术表达式)的源程序文件。输出:将源程序转换为中间代码形式表示,并将中间代码序列输出到文件中。若源程序中有错误,应指出错误信息二、 设计思路1、 词法分析程序设计与实现1)单词分类为了编程的实现。我们假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视到的第一个字符为字母,
6、则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表要事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。表1 语言中的各类单词符号及其分类码表单词符号类别编码类别码的助记符单词值begin1BEGINend2ENDif3IFthen4THENelse5ELSE标识符6ID字母打头的字母数字串无符号常数7UCON机内二进制表示8LT=9LE=10EQ11NE12GT=13GE:=14IS+15PL-16MI*17MU/18DI2) 词法分析器的设计函数GETCHAR
7、:每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。字符数组TOKEN:用来依次存放一个单词词文中的各个字符。函数CAT:每调用一次,就把当前ch中的字符拼接于TOKEN中所存字符串的右边。函数LOOKUP:每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为零。函数RETRACT:每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)。函数OUT:一般仅在进入终态时调用此函数,调用的形式为OUT(c,VAL)。图1 识别表I所列语言中的部分单词的DFA及相关的语义过程3)词法分
8、析程序的实现编写的扫描器:char TOKEN20,TOKEND20,TOKENDO20;int lookup (char*);void out (int, char*);void report_error (void);/extern void LEX(void);int siagn=0;/标志位FILE *fp1; char *KeyWordTableMAX_KEY_NUMBER=begin,end, if, then, else, KEY_WORD_END;/* 查保留字表,判断是否为关键字 */int lookup (char *token)int n=0;while (strcmp(
9、KeyWordTablen, KEY_WORD_END) /*strcmp比较两串是否相同,若相同返回0*/if (!strcmp(KeyWordTablen, token) /*比较token所指向的关键字和保留字表中哪个关键字相符*/return n+1; /*根据单词分类码表I,设置正确的关键字类别码,并返回此类别码的值*/break;n+;return 0;void scanner_example (FILE *fp)char ch; int i, c, isd,cpoint; double o;ch=fgetc (fp);/fgetc函数 在文件中读取一个字符if (isalpha
10、(ch) /*it must be a identifer! 它必须是一个标识符 判断字符ch是否为英文字母,若为小写字母,返回2,若为大写字母,返回1。若不是字母,返回0*/TOKEN0=ch; ch=fgetc(fp); i=1;while (isalnum (ch)|ch=.)/isalnum函数 判断ch是否为空 当ch为数字0-9或字母a-z及A-Z时,返回非零值,否则返回零if(ch=.)cpoint=-1;/标志字符串中有小数点TOKENi=ch; i+;ch=fgetc (fp);TOKENi= 0;if(ch=|ch=|ch=:) fseek (fp,-2,1);siagn=
11、1;else fseek (fp,-1,1);/fseek(fp,-1,1); /* retract fseek函数 每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)*/i=0;if(TOKENi=o|TOKENi=O)i+;if(TOKENi=x|TOKENi=X)i+;while(TOKENi!=0)if(!isdigit(TOKENi)|TOKENi!=a|TOKENi!=b|TOKENi!=c|TOKENi!=d|TOKENi!=e|TOKENi!=f|TOKENi!=A|TOKENi!=B|TOKENi!=C|TOKENi!=D|TOKENi!=E|TOKENi!=
12、F|TOKENi!=.)isd=-1;isd=16;/标志字符串十六进制i+;else if(TOKENi=0|TOKENi=1|TOKENi=2|TOKENi=3|TOKENi=4|TOKENi=5|TOKENi=6|TOKENi=7|TOKENi=.)isd=8;/标志字符串八进制i+;while(TOKENi!=0)if(TOKENi!=0|TOKENi!=1|TOKENi!=2|TOKENi!=3|TOKENi!=4|TOKENi!=5|TOKENi!=6|TOKENi!=7|TOKENi!=.)isd=-1;isd=8;i+;if(isd=8)strncpy(TOKEND,TOKEN
13、+1,strlen(TOKEN)-1);/拷贝函数/printf(%o,atof(TOKEND);o=octal(TOKEND);/printf(%g,o);sprintf(TOKENDO, %g,octal(TOKEND);out(OCTAL,TOKENDO);else if(isd=16)strncpy(TOKEND,TOKEN+2,strlen(TOKEN)-2);/拷贝函数o=octal(TOKEND);/printf(%g,o);sprintf(TOKENDO, %g,hex(TOKEND);out(HEX,TOKENDO);elseif(cpoint=-1)report_error
14、();/当字符串中有小数点时,为错误elsec=lookup (TOKEN);/looup查询函数 查找保留字if (c=0) out (ID,TOKEN); else out (c, );/out函数 输出功能elseif(isdigit(ch)/isdigit函数 检查参数c是否为阿拉伯数字0到9。/*TOKEN0=ch; ch=fgetc(fp); i=1;while(isdigit(ch)|ch=-|ch=E|ch=e|ch=.)TOKENi=ch; i+;ch=fgetc(fp);TOKENi= 0;*/int Class;fseek (fp,-1,1);Class=LEX(fp);
15、if(Class=1)char pi30 = ;itoa(ICON,pi,10);out(INT,pi);else if(Class=2)char pd30 = ;sprintf(pd, %g,FCON);out(DOUBLE,pd);elsereport_error( );/fseek(fp,-1,1);if(chf=|chf=|chf=:|chf=+|chf=-|chf=*|chf=/) fseek (fp,-2,1);siagn=1;else fseek (fp,-1,1);siagn=1;elseswitch(ch)case ) ch=fgetc(fp);if(isalnum (ch)
16、 fseek (fp,-2,1);else fseek (fp,-1,1);siagn=1;out (NE, );elsech=fgetc(fp);if(isalnum (ch) fseek (fp,-2,1);else fseek (fp,-1,1);siagn=1;out (LT, );break;case =:ch=fgetc(fp);if(isalnum (ch) fseek (fp,-2,1);else fseek (fp,-1,1);siagn=1;out(EQ, );break;case : ch=fgetc(fp);if(ch=)ch=fgetc(fp);if(isalnum
17、(ch) fseek (fp,-2,1);else fseek (fp,-1,1); siagn=1;out(GE, );elsech=fgetc(fp);if(isalnum (ch) fseek (fp,-2,1);else fseek (fp,-1,1);siagn=1;out(GT, );break;case :ch=fgetc(fp);if(ch=)ch=fgetc(fp);if(isalnum (ch) fseek (fp,-2,1);else fseek (fp,-1,1);siagn=1;out(IS, );else report_error();break;case+:ch=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【Fis****915】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【Fis****915】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。