2023年计算LL析法实验报告.docx
班级:计算机12 2 姓名:张凯华 学号:实验名称:LL(1)分析法实验目的和规定(-)目的通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进 行语法检查和结构分析,进一步掌握常用的语法分析方法。规定选择最有代表性的语法分析方法,如算符优先法、递归子程序法和LR分析法选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并 且与所选语法分析方法要比较贴切。(3)实习时间为4-6小时。实验内容和环节:一、实验内容对下列文法,用L L(1)分析法对任意输入的符号串进行分析:(1) E->TG、(2) T->FS(3) G->+TG(4) G->A(5) S->*FS(6) S->A(7) F->(E)(8) F->im=j ;/*行号*/。2。b re a k ;oa)for( j =0;j<=5;j+)。oif(ch=v1j )对an=j; /*列号*/。 b r eak;oo|cha=Cm n;,if(cha.origin! ='N' )/*判断是否为空*/° (。 P r i nt();。»p r inti ();。op r in t f ("%c- cha. o rigin) 输出产生式 7。f o r (j =0; j <ch a . 1 en g t h; j +)prin t f(" %c",cha.a r ra y j);。»prin t f (,fn");gfor(j = (c ha. 1 e ng t h-1); j >= 0 ; j-) /*产生式逆序入栈*/8A+top =ch a .arra y j ;。i f (Ato P='人"为空则不进栈*/ooofop-J。/* i f7e Ise/*犯错解决7。opr int();print 1 ();叩rin t f (" % c犯错n ” ,x);/*输出犯错非终结符* / e x i t(1);. /*e 1 se * /®/* else*/whil e (finish= 0 );/*mai n */(2)给出运营结果» 'E:Microsoft Visual StudioMyProjectsKMeansK_MeansSUYDebugLLl.exe*1ttGT2ttGSF3ttGSiRGS5ItGSF*MGSFttGS>E<8UGS)E9ttGS>GTIMAGSGSF11ttGS>GSi12ttGS>GS13ttGS>GL4UGS>GT>L5MGS>GTL6#GSGSFL7HGSGSiL8MGS XISttGS>G,,),构乘除字符i*<i+i>tt*<i+i>tti*i># i*i># i>« i>« i>tti>tt i>tt i>tt>tt>lt成的以,肥结束的字符串进行分析,所用产生式E-TG己S己 > 己 酉甲酉E酉G T匹T匹Y匹TT-FSF-ii匹配S-*G己 已 T酉S 酉 T匹TT匹, G T F i S1921ttGS22ttG23acc?四、实验总结:通过对语法分析程序的设计和编写,使自己获得了很大的收获,并且使自己对语法分析程序的功能有了更进一步结识。虽然在程序的设计和编写过程中出现了一些错误,但是通过同学的帮助和指导,顺利的将程序中存在 的错误顺利解决,从而顺利完毕了本程序的设计和编程。输出的格式如下:(1)提醒:本程序只能对由,''构成的以#结束的字符串进行分析(2)请输入要分析的字符串:(3)输出过程如下:环节分析栈剩余输入串所用产生式1 E i +i*i# E->TG(4)输入符号串为非法符号串(或者为合法符号串)备注:(1)在“所用产生式”一列中假如相应有推导则写出所用产生式;假如为匹配终结符则写明匹配的终结符; 如分析异常犯错则写为“分析犯错”;若成功结束则写为“分析成功工(2)在此位置输入符号串为用户自行输入的符号串。(3)上述描述的输出过程只是其中一部分的。注意:1 .表达式中允许使用运算符(+* / )、分割符(括号)、字符i,结束符#;2 .假如碰到错误的表达式,应输犯错误提醒信息(该信息越具体越好);二、实验环节.程序编写(1)定义部分:定义常量、变量、数据结构。(2)初始化:设立LL(1)分析表、初始化变量空间(涉及堆栈、结构体、数组、临时变量等);(3)控制部分:从键盘输入一个表达式符号串;(4 )运用LL(1 )分析算法进行表达式解决:根据LL ( 1 )分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,假如碰到错误则显示错误信息。三、实验过程记录:(1)写出程序/*LL(1)分析法源程序,只能在VC+中运营7# i nc 1 ude<stdio.h># inclu d e<std 1 ib.h># i nclud e <stri n g.h># incl u d e <do s .h>char A 20;/* 分析栈*/char B20: /*剩余串*/charv120 =-,+,*;&) '#') ;/*终结符*/char v2 20 = 'E'/G'; T,S, 'F' ;/*非终结符 7in t j=0,b=0,top=0, I; /*L 为输入串长度 */ty p ed e f struc t type/*产生式类型定义*/(char o rig i n ;/*大写字符*/char array5;/*产生式右边字符 7An t 1 engt h ;/*字符个数* / t ype;t y pe e,t, g , g1, s, s1,f, f1; /* 结构体变量 */type C10 1 0;/* 预测分析表 7void prin t ()/*输出分析栈7(int a; /*指针*/4or(a=0;a<=top +1 ; a+)。 print f ("%c", A a );print f (A t t"); "print* /void print1()/*输出剩余串*/(intj;for(j=0: j<b; j+)/*输出对齐符*/»p rintf (H");4or(j=b;j<= 1 ;j+)P rint f ("%c ,Bj );oprin tf ("ttt H); / * pri n t 1 7void main ()(nt m, n ,k=O,flag=O, f inish= 0 ;ch a r c h ,x;ty pe cha; /*用来接受 Cm n7/ *把文法产生式赋值结构体*/e. o rigin=,E,;s t r c p y (e.array, " TGM);»e. e n g th= 2 ;4. o ri g in=T;° s t r c p y (t.a r ray, "FS ");4.length=2;g. o r igi n = , G's t rcpy(g.ar ray , " +TG");g.leng t h=3;og 1 .origin=r G'g 1 .a r ra y 0=,A,;gl.leng t h =1;s.origin=z Ss trcp y (s. array, n *F S");1 e n g t h=3;5. orig i n='S'®s1. a rra y 0=,A,;S 1 . Ie n g t h = 1 ;。f .orig i n='F's trcpy(f.a r ray,M( E)");4.len g th=3:41.originF'41 .ar r ay0='i";f 1. I e n gt h =1;for (m=0;m<= 4 ;m+) /*初始化分析表*/f or (n=0; n <= 5 ;n+)。Cmn .orig i n=/ N'/*所有赋为空*/*填充足析表*/C00 =e;C 03 =e;C1 1 =g;C 14=g1;C 1 5 =g1;C2 0 = t ; C2 3=t;C31=S1; C32=s;C3 4=C3 5=s 1 ;C4 0 =f1 ; C4 3= f ;pr i n t f ("提醒:本程序只能对由',中,'*:构成的以#结束的字符串进行分析,n"); printf("请输入要分析的字符串:”);do/*读入分析串*/(sea n f ( " %c", & c h);i f (ch! J i z ) &&(ch!=,+ / ) &&(ch!=, *')&&(ch!='(')&&(ch !=')') &&(ch!=, #') (printf ("输入串中有非法字符rT);exit ;)Bj=ch;j+;while(ch! ='#,);l= J ;/*分析串长度7ch = B0 ; /*当前分析字符*/Ato p ='#' A+top='E,E,进栈*/P ri n tf("环节tt分析栈t t剩余字符tt所用产生式n");dox=A to p-;/*x为当前栈顶字符*/prin t f ("%d”, k +);P r intf(Htt");for0=O;j<=5; j+ + )/*判断是否为终结符*/if(x=v1 j)(flag=1;b rea k;)if(flag=1)/*假如是终结符*/i f (x=, #')(fin i sh=17*结束标记* /prin tf(”acc!n");/*接受 7。getchar ();g getchar ():e x*1);/*if* /if(x=ch)a 。pri n t();a pri nt1();。,print f ("%c 匹配n",ch);。 a ch=B +b;/*下一个输入字符* /。fl a g=0; / *恢复标记*/a /*if*/。2 else/*犯错解决文 /6gg print ();。print 1 ();。p r i n t f(" %c犯错n”,c h );/*输出犯错终结符*/。 exit( 1);/*el s e*/ /*if7。e 1 se/*非终结符解决*/。 f or(j= 0 ; j<=4 ;j+)。if(x=v20)。