收藏 分销(赏)

实验二语法分析程序设计和实现.docx

上传人:人****来 文档编号:3025254 上传时间:2024-06-13 格式:DOCX 页数:13 大小:106.40KB
下载 相关 举报
实验二语法分析程序设计和实现.docx_第1页
第1页 / 共13页
实验二语法分析程序设计和实现.docx_第2页
第2页 / 共13页
实验二语法分析程序设计和实现.docx_第3页
第3页 / 共13页
实验二语法分析程序设计和实现.docx_第4页
第4页 / 共13页
实验二语法分析程序设计和实现.docx_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、试验二 语法分析程序设计和实现一、试验目标任选一个有代表性语法分析方法,如算符优先法、递归下降法、LL(1)、SLR(1)、LR(1)等,经过设计、编制、调试实现一个经典语法分析程序,对试验一所得扫描器提供单词序列进行语法检验和结构分析,实现并深入掌握常见语法分析方法。二、基础试验内容和要求选择对多种常见高级程序设计语言全部较为通用语法结构算术表示式一个简化子集作为分析对象,依据以下描述其语法结构BNF定义G2,任选一个学过语法分析方法,针对运算对象为无符号常数和变量四则运算,设计并实现一个语法分析程序。G2: | + | - | * | / | ()若将语法范围、和分别用E、T、F和i代表,

2、则G2可写成:G2E:E T | E+T | E-T T F | T*F | T/F F i | (E)输入:由试验一输出单词串,比如:UCON,PL,UCON,MU,ID 输出:若输入源程序中符号串是给定文法句子,则输出“RIGHT”,而且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,而且显示分析至此所得中间结果,如分析栈、符号栈中信息等,和必需犯错说明信息。要求:1、确定语法分析程序步骤图,同时考虑对应数据结构,编写一个语法分析源程序。2、将词法、语法分析合在一起组成一个完整程序,并调试成功。3、 供测试例子应包含符合语法规则语句,及分析程序能判别若干错例。对于所输

3、入字符串,不管对错,全部应有明确信息输出。三、问题分析及源程序LL1文法:改写文法为:E- TG e G +TG gT- FS tF- -TG g1G- g2S- *FS sT- /FS s1S- s2F- (E) fG- i f1分析表:i+-*/()#EeeGgg1g2g2TttSs2s2ss1s2s2Ff1fLL1源程序#include#include #include#includechar A30; /*分析栈*/char B30; /*剩下串*/char v120=i,+,-,*,/,(,),#; /*终止符*/char v220=E,G,T,S,F; /*非终止符*/ int j

4、=0,b=0,top=0,l; /*L为输入串长度*/class type /*产生式类型定义*/public:char origin; /*大写字符*/char array5; /*产生式右边字符 */int length; /*字符个数*/;type e,t,g,g1,g2,s,s1,s2,f,f1; /*类对象*/type C1010; /*估计分析表*/void print() /*输出分析栈*/int a;for(a=0;a=top+1;a+)coutAa;couttt;void print1() /*输出剩下串*/int j;for(j=0;jb;j+) /*输出对齐符*/cout

5、 ;for(j=b;j=l;j+)coutBj;coutttt;void main()int m,n,k=0,flag=0,finish=0;char ch,x;type cha; /*用来接收Cmn*/*把文法产生式赋值结构体*/e.origin=E;strcpy(e.array,TG);e.length=2;t.origin=T;strcpy(t.array,FS);t.length=2;g.origin=G;strcpy(g.array,+TG);g.length=3;g1.origin=G;strcpy(g1.array,-TG);g1.length=3;g2.origin=G;g2.

6、array0=;g2.length=1; s.origin=S;strcpy(s.array,*FS);s.length=3;s1.origin=S;strcpy(s1.array,/FS);s1.length=3;s2.origin=S;s2.array0=;s2.length=1;f.origin=F;strcpy(f.array,(E);f.length=3;f1.origin=F;f1.array0=i;f1.length=1;for(m=0;m=4;m+) /*初始化分析表*/for(n=0;n=7;n+)Cmn.origin=N; /*全部赋为空*/ /*填充足析表*/ C00=e

7、;C05=e; C11=g;C12=g1;C16=g2;C17=g2; C20=t;C25=t; C31=s2;C32=s2;C33=s;C34=s1;C36=s2;C37=s2; C40=f1;C45=f; cout提醒:本程序只能对由i,+,-,*,/,(,)组成以#结束字符串进行分析,n; coutch; if (ch!=i) &(ch!=+)&(ch!=-)&(ch!=*)&(ch!=/)&(ch!=()&(ch!=)&(ch!=#) cout输入串中有非法字符n; exit(1); /强制退出程序 Bj=ch; j+; while(ch!=#); l=j;/*分析串长度*/ ch=B

8、0;/*目前分析字符*/ Atop=#; A+top=E;/*#,E进栈*/ cout步骤tt分析栈 tt剩下字符 tt所用产生式 n; do x=Atop-;/*x为目前栈顶字符*/ coutk+; couttt; for(j=0;j=7;j+)/*判定是否为终止符*/ if(x=v1j) flag=1; break; if(flag=1)/*假如是终止符*/ if(x=#) finish=1;/*结束标识*/ coutacc!endl;/*接收 */ getchar(); exit(1); /退出程序 /*if*/ if(x=ch) print(); print1(); cout匹配end

9、l; ch=B+b;/*下一个输入字符*/ flag=0;/*恢复标识*/ else/*犯错处理*/ print(); print1(); cout犯错endl;/*输出犯错终止符*/ exit(1); else/*非终止符处理*/ for(j=0;j=4;j+)if(x=v2j)m=j;/*行号*/break; for(j=0;j=7;j+)if(ch=v1j)n=j;/*列号*/break; cha=Cmn; if(cha.origin!=N)/*判定是否为空*/ print();print1();coutcha.origin; /*输出产生式*/for(j=0;jcha.length;j+) coutcha.arrayj;cout=0;j-) /*产生式逆序入栈*/A+top=cha.arrayj;if(Atop=)/*为空则不进栈*/top-;else/*犯错处理*/print();print1();cout犯错endl;/*输出犯错非终止符*/exit(1); while(finish=0);运行结果:

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服