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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

编译原理语法分析实验报告.docx

1、编译原理语法分析实验报告编译原理实验报告-语法分析班级:XXX学号:XXX姓名:XXX年 月 日 1、 摘要:用递归子程序法实现对pascal的子集程序设计语言的分析程序2、 实验目的:通过完成语法分析程序,了解语法分析的过程和作用3、 任务概述实验要求:对源程序的内码流进行分析,如为文法定义的句子输出”是”否则输出”否”,根据需要处理说明语句填写写相应的符号表供以后代码生成时使用4、 实验依据的原理递归子程序法是一种自顶向下的语法分析方法,它要求文法是LL(1)文法。通过对文法中每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选式时,程序能

2、够按LL(1)形式唯一地确定选择某个候选式进行推导,最终识别输入串是否与文法匹配。递归子程序法的缺点是:对文法要求高,必须满足LL(1)文法,当然在某些语言中个别产生式的推导当不满足LL(1)而满足LL(2)时,也可以采用多向前扫描一个符号的办法;它的另一个缺点是由于递归调用多,所以速度慢占用空间多,尽管这样,它还是许多高级语言,例如PASCAL,C等编译系统常常采用的语法分析方法。为适合递归子程序法,对实验一词法分析中的文法改写成无左递归和无左共因子的如下:。PROGRAM标识符; CONST;|标识符=无符号整数, |VAR |标识符:;,标识符 | |INTEGER | LONG;|PR

3、OCEDURE标识符;(标识符: )|;|标识符:=|()|IFTHENWHILEDO READ(标识符)WRITE(),|BEGINEND;|ODD+|-|e标识符|无符号整数|()+|-*|/ =|=5、 程序设计思想为每个非终结符设计一个识别的子程序,寻找该非终结符也就是调用相应的子程序。由于单词在语法分析中作为一个整体,故在语法识别中仅使用其内码。在这里将词法分析作为语法分析的一个子程序,当语法分析需要单词时,就调用相应的词法分析程序获得一个单词。语法分析的作用是识别输入符号串是否是文法上定义的句子,即判断输入符号串是否是满足“程序”定义的要求。也就是当语法识别程序从正常退出表示输入符

4、号串是正确的“程序”;若从出错退出,则输入符号串不是正确的“程序”。出错时,可以根据读字符的位置判断出错的位置。表2-1为非终结符和函数名对照表。表2-1 非终符和函数名对照表非终结符函数名非终结符函数名programprogheadblockconsexplconsdefivarexlconssuffvandefivarsuff过程说明部分procdefitypeilprocedhprocsuffassiprosentencesuffixifsentreadwhilsentidsuffwritecompsentexprsuffsentsuffconditiotermsuffexpresste

5、rmfactsuffargumentfactoraddopermuloperrespoper表2-2为词法分析中的内码单词对照表。表2-2 内部码对照表内码单词内码单词内码单词内码单词1PROGRAM2CONST3VAR4INTEGER5LONG6PROCEDURE7IF8THEN9WHILE10DO11READ12WRITE13BEGIN14END15ODD16+17-18*19/20=21222325=26.27,28;29:30:=31(32)33无符号整数34标识符35#6、 实验结果分析样例1:正确的pascal子集程序代码PROGRAM test;CONST b=3;VAR x:I

6、NTEGER;y:LONG;PROCEDURE c(d:INTEGER);BEGINd(5);x:=d+4;y:=b*2+2;END;BEGINWHILE x5 THEN x:=2*x-b;END.运行结果1:样例2:错误的pascal子集程序代码test;CONST b=3;VAR x:INTEGER;y:;PROCEDURE c(d:INTEGER);BEGINd(5);x:=d+4;y:=b*2+;END;BEGINWHILE x5 x:=2*x-b;END运行结果2:7、 总结通过本次实验,我能够用递归子程序法设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进

7、行语法检查和结构分析,更加了解了语法分析的过程和作用。附件:LEX代码:% #include #include #include FILE *fp; int line = 1;% delim t whitespace delim+ backspace nprogram pPrRoOgGrRaAmMconst cCoOnNsStTvar vVaArRinteger iInNtTeEgGeErRlong lLoOnNgGprocedure pPrRoOcCeEdDuUrReEif iIfFthen tThHeEnNwhile wWhHiIlLeEdo dDoOread rReEaAdDwrite

8、wWrRiItTeEbegin bBeEgGiInNend eEnNdDodd oOdDdDadd +minus -multiply *div /equal =m21 m22 m23 m25 =m27 ,m26 .m28 ;m29 :m30 :=m31 (m32 )constant (0-9)+identfier A-Za-z(A-Za-z|0-9)*% program fprintf(fp,%d %dn,1,line);const fprintf(fp,%d %dn,2,line);var fprintf(fp,%d %dn,3,line);integer fprintf(fp,%d %dn

9、,4,line);long fprintf(fp,%d %dn,5,line);procedure fprintf(fp,%d %dn,6,line);if fprintf(fp,%d %dn,7,line);then fprintf(fp,%d %dn,8,line);while fprintf(fp,%d %dn,9,line);do fprintf(fp,%d %dn,10,line);read fprintf(fp,%d %dn,11,line);write fprintf(fp,%d %dn,12,line);begin fprintf(fp,%d %dn,13,line);end

10、fprintf(fp,%d %dn,14,line);odd fprintf(fp,%d %dn,15,line);add fprintf(fp,%d %dn,16,line);minus fprintf(fp,%d %dn,17,line);multiply fprintf(fp,%d %dn,18,line);div fprintf(fp,%d %dn,19,line);equal fprintf(fp,%d %dn,20,line);m21 fprintf(fp,%d %dn,21,line);m22 fprintf(fp,%d %dn,22,line);m23 fprintf(fp,%

11、d %dn,23,line);m24 fprintf(fp,%d %dn,24,line);m25 fprintf(fp,%d %dn,25,line);m26 fprintf(fp,%d %dn,26,line);m27 fprintf(fp,%d %dn,27,line);m28 fprintf(fp,%d %dn,28,line);m29 fprintf(fp,%d %dn,29,line);m30 fprintf(fp,%d %dn,30,line);m31 fprintf(fp,%d %dn,31,line);m32 fprintf(fp,%d %dn,32,line);consta

12、nt _int64 maxnum=0xffffffff;if(strlen(yytext)10) printf(line %d constant error:%sn,line,yytext);elsefprintf(fp,%d %dn,33,line);identfier if(strlen(yytext)20) printf(line %d identfier error:%sn,line,yytext);elsefprintf(fp,%d %dn,34,line);whitespace backspace if(strcmp(yytext,n)=0)line+;% void main()

13、yyin=fopen(example.txt,r); fp=fopen(data.txt,w); fclose(fp); fp=fopen(data.txt,a); yylex(); /* start the analysis*/ fclose(yyin); fclose(fp); int yywrap() return 1; 主程序代码:#include#include#include#includelex.yy.cusing namespace std;int token20002 = NULL;int h = 0; int i,j,p=0; void program();void blo

14、ck();void consdefi();void conssuff();void varsuff();void typeil();void procsuff();void sentence();void ifsent();void whilsent();void write();void exprsuff();void conditio();void express();void factsuff();void factor();void muloper();void proghead();void consexpl();void varexl();void vandefi();void p

15、rocdefi();void procedh();void assipro();void suffix();void read();void idsuff();void compsent();void sentsuff();void termsuff();void term();void argument();void addoper();void respoper();void program() proghead(); block(); if (tokenh0 =26) h+; if (tokenh0 = 0) printf(语法分析完成n); else p=1;printf(第%d行缺少

16、.n,tokenh-11); return;void proghead() if (tokenh0 = 1) h+; if (tokenh0 = 34) h+; if (tokenh0 = 28) h+; else p=1;printf(第%d行缺少;n, tokenh-11); else p=1;printf(第%d行缺少标识符n, tokenh-11); else p=1;printf(第%d行缺少PROGRAMn, tokenh1); if (tokenh0 = 34) h+; if (tokenh0 = 28) h+; void block() consexpl(); varexl()

17、; procdefi(); compsent(); return;void consexpl() if (tokenh0 != 6 & tokenh0 != 3 & tokenh0 != 13) if (tokenh0 = 2) h+; consdefi(); conssuff(); if (tokenh0 = 28) h+; else p=1;printf(第%d行缺少;n, tokenh-11); else p=1;printf(第%d行缺少CONSTn, tokenh1); consdefi(); conssuff(); if (tokenh0 = 28) h+; return;void

18、 consdefi() if (tokenh0 = 34) h+; if (tokenh0 = 20) h+; if (tokenh0 = 33) h+; else p=1;printf(第%d行缺少无符号整数n, tokenh-11); else p=1;printf(第%d行缺少=n, tokenh-11); else p=1;printf(第%d行缺少标识符n, tokenh-11); if (tokenh0 = 20) h+; if (tokenh0 = 33) h+; return;void conssuff() if (tokenh0 != 6 & tokenh0 != 3 & t

19、okenh0 != 13) if (tokenh0 = 28)return; if (tokenh0 = 27) h+; consdefi(); conssuff(); else p=1;printf(第%d行缺少,n, tokenh-11); consdefi(); conssuff(); return;void varexl() if (tokenh0 != 6 & tokenh0 != 13) if (tokenh0 = 3) h+; vandefi(); varsuff(); else p=1;printf(第%d行缺少VARn, tokenh1); vandefi(); varsuf

20、f(); return;void vandefi() if (tokenh0 = 34) h+; idsuff(); if (tokenh0 = 29) h+; typeil(); if (tokenh0 = 28) h+; else p=1;printf(第%d行缺少;n, tokenh-11); else p=1;printf(第%d行缺少:n, tokenh-11); else p=1;printf(第%d行缺少标识符n, tokenh-11); idsuff(); if (tokenh0 = 29) h+; typeil(); if (tokenh0 = 28) h+; return;

21、void idsuff() if (tokenh0 = 4 | tokenh0 = 5) return; if (tokenh0 != 32 & tokenh0 != 29) if (tokenh0 = 27) h+; if (tokenh0 = 34) h+; idsuff(); else p=1;printf(第%d行缺少标识符n, tokenh-11); else p=1;printf(第%d行缺少,n, tokenh-11); return;void varsuff() if (tokenh0 != 6 & tokenh0 != 13) vandefi(); varsuff(); return;void typeil() if (tokenh0 = 4|tokenh0=5) h+; else p=1;printf(第%d行缺少INTEGER或LONGn, token

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

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