资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
为了适应公司新战略的发展,保障停车场安保新项目的正常、顺利开展,特制定安保从业人员的业务技能及个人素质的培训计划yacc语法分析器实验报告编译原理课内实验报告学生姓名石磊专业/班级计算机26学号所在学院电信学院提交日期XX-12-2一:实验目的:1.强化对系统软件综合工程实现能力的训练;2加强对语法分析原理、方法和基本实现技术的理解;二:实验内容1用C语言或者其他的高级语言作为宿主语言完成C0语言的词法分析器的设计和实现。2针对if语句的文法编写一个递归下降分析程序,输出结果为抽象语法树。注意,if语句文法中的表达式E采用四则运算表达式的文法;抽象语法树的格式自行设计,如果需要降低难度的话,也可用具体语法树而不用抽象语法树作为输出。三:实验功能描述1.编写C0语言的语法分析器的源程序并调试通过。其中语法分析程序既可以自己手动去完成,也可以利用YACC自动生成。2.通过测试程序的验收;四:功能描述:该语法分析器用yacc生成,针对if语句的文法编写的向下递归程序,输出结果为语法树,实现了实验目标,达到了实验要求。五:实验程序代码%#include#include#include#include#includeintyycount=0;externYYSTYPEyylval;#defineNSYMS20structsymtabchar*name;doublevalue;symtabNSYMS;structsymtab*symlook(char*s);#defineNRSVS10structrsvtabchar*name;intid;rsvtabNRSVS=if,IF,else,ELSE,while,WHILE,for,FOR,other,OTHER,v(来自:写论文网:yacc语法分析器实验报告)ar,VAR;intrsvlook(char*s);%digit0-9integerdigit+eq=pl+mi-mu*di/sc;as=identifiera-zA-Za-zA-Z0-9_*delimntwsdelim+otherother%integer/yylval=atoi(yytext);rec_token(INTEGER);returnINTEGER;identifierif(rsvlook(yytext)!=0)rec_token(RESERVED);returnrsvlook(yytext);rec_token(SYMBOL);returnSYMBOL;eqrec_token(OPR);returnEQ;plrec_token(OPR);returnPL;mirec_token(OPR);returnMI;murec_token(OPR);returnMU;direc_token(OPR);returnDI;asrec_token(OPR);returnASSIGN;screc_token(SC);returnSC;(rec_token(LB);returnLB;)rec_token(RB);returnRB;ws;.printf(error:%sn,yytext);yyerror(Illigalinput.);%char*buffer20;voidrec_token(char*s)_id=+yycount;=strdup(yytext);sprintf(buffer,%s(%s),s,yytext);name_node(yycount,buffer);intrsvlook(char*s)structrsvtab*sp;for(sp=rsvtab;spname&!strcmp(sp-name,s)returnsp-id;return0;structsymtab*symlook(char*s)structsymtab*sp;for(sp=symtab;spname&!strcmp(sp-name,s)returnsp;if(!sp-name)sp-name=strdup(s);returnsp;yyerror(Toomanysymbols.);exit(1);测试代码:if(1+1)if(2*3+5)if(3*4+9)if(5*3+2)other;elseother;elseother;elseother;elseb=2*3+5;测试结果:stseqstatementmifstRESERVED(if)LB()exptermfactorINTEGER(1)RB()mifstRESERVED(if)LB()exptermtermfactorINTEGER(2)OPR(*)factorINTEGER(3)OPR(+)exptermfactorINTEGER(5)RB()mifstRESERVED(if)LB()exptermterm编译原理实验报告题目:学生姓名:班级学号指导教师成绩:西安邮电大学计算机学院XX年5月28日一:实验目的掌握一种语法分析规则,并且能够动态的生成算符优先表或预测分析表。二:实验要求对于如下的文法,试编写调试一个语法分析程序:EE+T|TTT*F|FFPF|PP(E)|i要求和提示:可选择一种你感兴趣的语法分析方法作为编制语法分析程序的依据。对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造所给文法的机内表示。能进行分析过程模拟。如输入一个句子,能输出与句子对应的语法树,能对语法树生成过程进行模拟;能够输出分析过程每一步符号栈的变化情况。First集和Follow集生成算法模拟【问题描述】设计一个由给定文法生成First集和Follow集并进行简化的算法动态模拟。(算法参见教材)【基本要求】动态模拟算法的基本功能是:输入一个文法G;输出由文法G构造FIRST集的算法;输出First集;输出由文法G构造FOLLOW集的算法;输出FOLLOW集。【测试数据】输入文法:E-TEE-+TE|T-FTT-*FT|F-(E)|iFirstVT集和LastVT集生成算法模拟【问题描述】设计一个由给定文法生成FirstVT集和LastVT集的算法动态模拟。(算法参见教材P9092FirstVT和LastVT的构造算法)【基本要求】动态模拟算法的基本功能是:输入一个文法G;输出由文法G构造FIRSTVT集的算法;输出FirstVT集;输出由文法G构造LastVT集的算法;输出LastVT集。【测试数据】输入文法:E-TEE-+TE|T-FTT-*FT|F-(E)|i三:实验内容完成实验一和选作题的第二个四:采用的数据结构在第二个实验的时候要用到栈,来存放一些信息,这里采用链表来构建栈。structnodecharch2;structnode*next;/栈顶指针staticstructnode*stack=NULL;五:算法描述实验:采用yacc语法分析程序自动的帮助完成一系列的分析工作,自己只需要编写完整的代码,描述清楚所要实现的文法,并且要自己处理,文法中存在的冲突问题,解决办法按照标准要求写明。实验:FIRSTVT算法思想:设置一个int型数组,行号对应为非终结符,列号对应为终结符。将数组元素全部初始化为0.a.对于每个产生式寻找满足形如U-b或U-Vb的产生式,将对应数组U,b的值置为1,并且将对应的压栈。b.当栈不为空的时候,出栈顶元素,记为。对每个产生式寻找满足形为P-Q,的产生式,如果P,a=0时,将对应元素P,a的值置为1,并且压栈。c.直到栈为空时得到的二维数组为每行值对应为1的终结符为该行非终结符的FIRSTVT集根据同样的算法思想可以得到LISTVT集合。优先关系表的构建思想:对于每个产生式P-X1X2X3XN如果Xi和Xi+1都终结符在,则对应的优先关系为=如果Xi和Xi+2都为终结符,并且Xi+1为非终结符,则对应的Xi和Xi+2的优先关系为=如果Xi为终结符Xi+1为非终结符,则将FIRSTVT中的每个元素a,置对应XiXi+1.六:运行结果七:调试情况在生成FIRST时换取不同的文法时,程序发生了死循环。在WINDOS下创建的文法文件每行结束时是以/r/n占用两个字节,而在LINUX下换行只占用一个/n字节。八:设计技巧及体会设计技巧:对于文法中的|在写如文件时,已经做过一些处理,方便自己在以后的程序中的处理。体会:使用YACC,虽然开始时完全不了解,但是通过基本的学习,还是会一些使用,这样通过这个工具,使自己方便了自己的编写程序,节约了好多时间,并且比自己独立的去完成的更好,还是值得去学习和应用的九:源程序清单Yacc程序/说明部分%#include#includevoidyyerror(char*msg)fprintf(stderr,%s出错n,msg);%tokenDIGIT/定义一个终结符%left+-/运算符优先顺序%left*/%/语法规则目的-通过该培训员工可对保安
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号