




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LL(1)语法分析设计原理与实现技术实验报告变更说明日期版本变更位置变更说明作者2014/4/301.0初稿生成房皓一、 实验目的:本实验的目的在于在教师的引导下以问题回朔与思维启发的方式,使学生在不断的探究过程中掌握编译程序设计和构造的基本原理和实现技术,启迪学生的抽象思维、激发学生的学习兴趣、培养学生的探究精神和专业素养,从而提高学生发现问题、分析问题和解决问题的能力。2、 实验内容:实验项目 实现LL(1)分析中控制程序(表驱动程序);完成以下描述算术表达式的LL(1)文法的LL(1)分析程序。GE: ETEEATE|TFTTMFT|F (E)|iA+|-M*|/实验说明终结符号i 为用户定义的简单变量,即标识符的定义。设计要求(1)输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串是否为该文法定义的算术表达式的判断结果;(2)LL(1)分析过程应能发现输入串出错;(3)设计两个测试用例(尽可能完备,正确和出错),并给出测试结果。3、 实验环境:操作系统:Windows 7软件:VC+6.04、 程序功能描述:l 提供了文件输入方式,且输入的内容为二元式序列;l 能够对输入的字符串做出正确的LL(1)分析判断,并给出判断结果,判断结果输出到文件,并显示在屏幕;l 能发现输入串中的错误,包含非法字符,输入不匹配等;l 能够处理一些可预见性的错误,如文件不存在,输入非法等。五、数据结构设计:全局:局部(main()中):六、程序结构描述:l 设计方法:本程序采用从文件读取的输入方式,输入的内容需为二元式序列,然后按照LL(1)分析的方法对输入的字符串进行分析判断,并输出判断结果,程序通过对输入串的检查能够发现输入串中的错误。程序规定的单词符号及其种别码见下表:单词符号及其种别码表单词符号种别码单词符号种别码(1*5)2/6+3i7-4#8分析表i+-*/()#EETGETGGGATGGATGGGTTFHTFHHHHHMFHHMFHHHFFiF(E)AA+A-MM*M/l 主要函数说明:check_VT(char ch):bool型函数,检查ch是否为终结字符,是则返回true;create_analyseTable():构建分析表函数,无返回值;error(FILE *fp):输出错误,表示不是该文法的句子,参数fp用于退出前将打开的文件关闭;getnum_VN(char ch):int型函数,查找ch在非终结字符中的位置并返回;getnum_VT(char ch):int型函数,查找ch在终结字符中的位置并返回;justify():bool型函数,判断文件读取内容是否合法,包括检查非法字符和不匹配现象,出错返回false,否则返回true;main():主函数。l 函数调用关系说明:main()调用check_VT(char ch)、create_analyseTable()、error(FILE *fp)、getnum_VN(char ch)、getnum_VT(char ch)、justify();l 执行框图:七、 实验过程结果截图:l 测试用例一:i+i*i/i#l 测试用例二:i+i*i/#八、 实验总结:l 实验心得:通过本次实验我锻炼了自己的上机操作能力及编程能力,并对理论知识有了进一步的了解。老师提供的LL(1)分析法的流程图给了我很大的帮助,使得本实验基本思路变得很清晰,用较为简单的算法就能实现,程序的难点是产生式结构体的构造、分析表的构造、解决实验中遇到的问题也花费了一部分时间,我增长了处理关于文件错误的能力。l 实验中遇到的问题及解决方法:问题主要有i. 从文件输入二元式时,需要检查输入的内容是否符合程序规定的字符种别码,解决方法是用了两个字符数组token,token2,分别记录种别码和字符,并增加了一个函数justify()根据既定的种别码表判断;ii. 当输入内容不匹配或输入内容非法时要退出程序,此时若不关闭已经打开的文件可能导致文件内容受到破坏;解决方法是给error()函数设置一个文件指针变量参数FILE* fp,在退出程序之前通过fp关闭文件l 程序的自我评价:此程序实现了要求中的所有功能,并增加了输入串错误检测的功能,但因编程能力及经验的有限,其中有的地方不免有些繁杂,还有一些潜藏的问题,需要进一步测试与修改来提高程序的健壮性。九、 程序清单:/*课题名称:LL(1)语法分析设计原理与实现技术作者:房皓 进修生 13410801最后修改时间:2014.4.30*/*单词符号及其分类编码单词符号种别码(1)2+3-4*5/6i7#8/*文法*GE:E TEEATE|T FTTMFT|F (E)|iA +|-M *|/*改为等价文法*GE:ETGGATG|TFHHMFH|F(E)|iA+|-M*|/*分析表* i+-*/()#EETGETGGGATGGATGGGTTFHTFHHHHHMFHHMFHHHFFiF(E)AA+A-MM*M/*/#include#include#includeusing namespace std;#define MAX 50char analyseStackMAX;/分析栈char tokenMAX;/输入串typedef struct CSS/产生式结构体char left;char right5;int right_length;CSS;CSS E,G,G1,T,H,H1,F,F1,A,A1,M,M1;CSS analyseTable78;void error(FILE *fp)fprintf(fp,%s,FAIL!);fclose(fp);coutFAIL!endl;exit(0);bool justify(char ch,int i)/判断文件读取内容是否合法,包括检查非法字符和不匹配现象switch(ch)case 1:if(tokeni!=()return false;break;case 2:if(tokeni!=)return false;break;case 3:if(tokeni!=+)return false;break;case 4:if(tokeni!=-)return false;break;case 5:if(tokeni!=*)return false;break;case 6:if(tokeni!=/)return false;break;case 7:if(tokeni!=i)return false;break;case 8:if(tokeni!=#)return false;break;default:return false;break;return true;bool check_VT(char ch)if(ch=i | ch=+ | ch=- | ch=* | ch=/ | ch=( | ch=)return true;return false;int getnum_VN(char ch)char VN7=E,G,T,H,F,A,M;int i;for(i=0;i7;i+)if(ch=VNi)break;return i;int getnum_VT(char ch)char VT8=i,+,-,*,/,(,),#;int i;for(i=0;i8;i+)if(ch=VTi)break;if(i=8)coutFAIL!endl;exit(0);return i;void create_analyseTable()int i,j;E.left=E;strcpy(E.right,TG);E.right_length=2;G.left=G;strcpy(G.right,ATG);G.right_length=3;G1.left=G;strcpy(G1.right,NULL);G1.right_length=0;T.left=T;strcpy(T.right,FH);T.right_length=2;H.left=H;strcpy(H.right,MFH);H.right_length=3;H1.left=H;strcpy(H1.right,NULL);H1.right_length=0;F.left=F;strcpy(F.right,(E);F.right_length=3;F1.left=F;strcpy(F1.right,i);F1.right_length=1;A.left=A;strcpy(A.right,+);A.right_length=1;A1.left=A;strcpy(A1.right,-);A1.right_length=1;M.left=M;strcpy(M.right,*);M.right_length=1;M1.left=M;strcpy(M1.right,/);M1.right_length=1;for(i=0;i7;i+)for(j=0;j8;j+)analyseTableij.left=N;analyseTableij.right_length=0;analyseTable00=E;analyseTable05=E;analyseTable11=G;analyseTable12=G;analyseTable16=G1;analyseTable17=G1;analyseTable20=T;analyseTable25=T;analyseTable31=H1;analyseTable32=H1;analyseTable33=H;analyseTable34=H;analyseTable36=H1;analyseTable37=H1;analyseTable40=F1;analyseTable45=F;analyseTable51=A;analyseTable52=A1;analyseTable63=M;analyseTable64=M1;int main()char a,X;int i=0,j=0,m,u=0,v=0;/i指示栈顶位置,j指示剩余串扫描位置int num_vn,num_vt;bool flag=true;char token1MAX;char token2MAX;FILE *fpin,*fpout;create_analyseTable();/创建分析表/读文件部分if(fpin=fopen(input.txt,r)=NULL)cout文件打开失败!endl;exit(0);if(fpout=fopen(result.txt,w)=NULL)fclose(fpin);cout文件打开失败!endl;exit(0);token1v+=fgetc(fpin);while(!feof(fpin)token1v+=fgetc(fpin);if(v%5)=0)token2u=token1v-4;tokenu=token1v-2;if(justify(token2u,u)u+;elsefclose(fpin);error(fpout);fclose(fpin);if(v-1)%5 != 0)error(fpout);cout读入字符串为:tokenendl;/分析器部分analyseStacki+=#;analyseStacki=E;a=tokenj;while(flag)X=analyseStacki;if(check
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度高端玻璃制品仓储及绿色物流配送合同
- 2025年网红直播平台专属虚拟礼物定制服务合同
- 2025年企业间专利技术共享及风险预警管理协议
- 2025年度企业环保合规性审查咨询合同范本
- 2025年科技园区研发中心租赁合同:含企业知识产权保护服务
- 2025年旅游区厕所清洁服务及特色卫生用品销售合同
- 2025年企业钟点工日常维护与清洁服务合同
- 2025年高科技企业研发成果知识产权质押贷款合同
- 2025历史题材电视剧剧本修订与影视制作服务合同
- 2025年智慧景区夜景照明设施建设与维护服务合同
- 小儿上呼吸道感染
- 2025年CCAA国家注册审核员考试(产品认证基础)历年参考题库含答案详解(5卷)
- 2025-2030中国骨科手术导航机器人医生培训体系与手术量增长关联报告
- 2025年秋季小学四年级上册语文教学计划及教学进度表
- 北京市西城区2024-2025学年七年级下学期期末道德与法治试题(解析版)
- 苏州工业园区外国语学校语文新初一均衡分班试卷
- 《智能建造概论》高职完整全套教学课件
- 2025-2026小学学年度第一学期教学工作安排表:启智育心绘蓝图筑梦前行谱新篇
- GB/T 30807-2025建筑用绝热制品浸泡法测定长期吸水性
- 无限极中医秋季养生课件
- GB/T 23806-2025精细陶瓷断裂韧性试验方法单边预裂纹梁(SEPB)法
评论
0/150
提交评论