2023年语法分析器实验报告.pdf
语法分析器的设计实验报告一、实验内容语法分析程序用LL(1)语法分析方法。一方面输入定义好的文法书写文献(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIR S T集合,每个非终结符号的F O LLOW集合,以及每个规则的SELECT集合,并判断任意一个非终结符号的任意两个规则的SELECT集的交集是不是都为空,假如是,则输入文法符合LL(1)文法,可以进行分析。对于文法:GE:E-E+T I TT-T*F I FF-i|(E)分析句子i+i*i是否符合文法。二、基本思想1、语法分析器实现语法分析是编译过程的核心部分,它的重要任务是按照程序的语法规则,从由词法分析输出的源程序符号串中辨认出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。语法分析程序的流程图如图5-4所示。语 法 分 析 程 序 流 程 图该程序可分为如下几步:(1)读入文法(2)判断正误(3)若无误,判断是否为L L(1)文法(4)若是,构造分析表;(5 )由句型判别算法判断输入符号串是为该文法的句型。三、核心思想该分析程序有1 5部分组成:(1)一方面定义各种需要用到的常量和变量;(2)判断一个字符是否在指定字符串中;(3 )读入一个文法;(4)将单个符号或符号串并入另一符号串;(5)求所有能直接推出&的符号;(6)求某一符号能否推出&(7)判断读入的文法是否对的;(8)求单个符号的F I R S T;(9)求各产生式右部的F I R S T ;(1 0 )求 各 产 生 式 左 部 的F O L L O W;(1 1)判 断 读 入 文 法 是 否 为 一 个L L (1)文法;(1 2)构 造 分 析 表M;(13)句 型 判 别 算 法;(1 4)一 个 用 户 调 用 函 数;(1 5)主 函 数;下 面 是 其 中 几 部 分 程 序 段 的 算 法 思 想:1、求能推出空的非终结符集I、实例中求直接推出空的e mp t y 集的算法描述如下:void em p(char c)参数c 为空符号c h a r t empl 0;定义临时数组int i;of o r(i=0;i B,B 可推出空)如i f 右部长度为1但第一个字符为终结符,t h e n 返回0(A-a,a 为终结符)“elsefo r(k=0;k AB)。i f找到的字符与当前字符相同(A-AB)。结束本次循环else(ma r k 等于 0)查找右部符号是否可推出空字,把返回值赋给result。把当前符号加入到临时数组emp t 口 里.)。i f 当前字符不能推出空字且还没搜索完所有的产生式th e n 跳出本次循环继续搜索下一条产生式e 1 s e if/当前字符可推出空字,返 回 1002、计算每个符号的firs t 集:实例中求单个符号的FIRST集的算法描述如下:v o i d f irs t 2(i n t i)参数i 为符号在所有输入符号中的序号。等于指示器i 所指向的符号。在保存终结符元素的te r m i n 口数组查找cif c 为终结符(CGVT),thenFIRST(cc在保存终结符元素的n o n e r口 数组查找ci f c 是非终结符(CGVN)在所有产生式中查找c 所在的产生式i f 产生式右部第一个字符为终结符或空(即c f a(ad VT)或 cf&)t hen把 a 或&加进FIRST(c)if产生式右部第一个字符为非终结符th enif 产生式右部的第一个符号等于当前字符then跳到下一条产生式进行查找求当前非终结符在所有字符集中的位置if 当前非终结符还没求其F I RST集 the n查找它的FIRST集并标记此符号已求其FI RST集。求得结果并入到c 的 F I R S T 集.i f 当前产生式右部符号可推出空字且当前字符不是右部的最后一个字符then获取右部符号下一个字符在所有字符集中的位置if 此字符的FIRST集尚未查找then找其F I R S T 集,并标其查找状态为1把求得的FI RST集并入到c 的F IR S T 集.i f 当前右部符号串可推出空且是右部符号串的最后一个字符(即产生式为c-Y|Y2“Yk,若对一切 l=i E)的产生式if X 在产生式右部的最后(形如产生式A-aX)then查找非终结符A 是否已经求过其FOLL 0 W 集.避免循环递归i f 非终结符A 已求过其FO LLOW 集 thenFOLLOW(A)GFOL LOW(X)继续查下一条产生式是否具有Xelse求 A 之 FOL LOW 集,并标记为A 已求其FOLLOW集else if X 不在产生式右部的最后(形如A-aB p)thenif右部X 后面的符号串p能推出空字 th e n查找。是否已经求过其FOLLOW集.避免循环递归i f 已求过p的 FOL LO W 集 thenFOLLOW(A)e FOL L OW(B)结束本次循环e Ise if p不能推出空字then求 FIRST(p)把 FIR ST(B)中所有非空元素加入到FOLLOW(B)中标记当前规定的非终结符X 的 FOLL 0 W 集已求过4.计算SELECT集SELECT集的构造算法如下:对所有的规则产生式A-x:(1)若 x 不能推出空字 ,则 S E L E C T(A f x)=F I R S T(x);(2)若 x 可推出空字 ,则 SELECT(A-x)=FI R ST(x)-旨 U FOLLOW(A)算法描述如下:。f or(i=0*=产生式总数-l;i+)先把当前产生式右部的FIRST集(一切非空元素,不涉及)放入到当前产生式的SELECT(i);i f 产生式右部符号串可推出空字 then把 i 指向的当前产生式左部的非终结符号的FOLLOW 集并入至IJSELEC T(i)中5.判断是否L L(l)文法要判断是否为LL(1)文法,需要输入的文法G 有如下规定:具有相同左部的规则的SELECT集两两不相交,即:SELECT(A-a)n SELECT(A-p)=0假如输入的文法都符合以上的规定,则该文法可以用LL(1)方法分析。算法描述如下:。把第一条产生式的SELECT(0)集放到一个临时数组tern p 中ofor(i=l;i =产生式总数-l;i+)求 t e m p的长度le n gth-i f i 指向的当前产生式的左部等于上一条产生式的左部then。把 S E L E C T 并入到temp数组中。出 temp的长度小于1 e n g t h 加上S E L EC T(i)的长度返回0el s e把 temp清空把 SEL E CT(i)存放至U t em p 中结果返回1;四、算法#i n c 1 u d e#inc 1 ud e#i nclude/*Ii n t coun t=0;产生式的个数int number;所有终结符和非终结符的总数char s ta r t;/开始符号c h a r t erm in 5 0;/终结符号cha r non_te r 50;非终结符号c ha r v 50;所有符号c h a r left5 0;左部c h ar right5 0 5 0;/右部c h ar f i r s t 5 050,fo 1 low 5 0 50;/各产生式右部的 F I RST 和左部的FOLL O W 集合ch a r firs 11 50 50;所有单个符号的FIRST集合char sele c t 50 50;/各个产生式的SELE C T 集合c har f irs t f 1 ag50,fo 1 lowf 1 ag5 0;记录各符号的 FIR S T 和 FOLLOW是否已求过ch a r foil 2 0 ;char em p ty 20;记录可推出&的符号c h ar n o nem p ty2 0 ;。/记录不可推出&的符号c har e m p t2 0;求_em p()时使用cha r TEMP5 0 J;/F O L L O W 时存放某一符号串的FIR S T 集合in t v a lidity=l;表达输入文法是否有效int 11=1;/表达输入文法是否为L L文法int M2 020;/分析表c ha r c h oose;用户输入时使用/求 FOL LOW集合时使用/*判断一个字符C是否在指定字符串P 中*/int i n(c har c,cha r*p)(o i n t i;i f(s t rlen(p)=0)r eturn(O);for(i=0;i+)。i f(pi=c)。or e tu rn(l);/若在,返回 1。if(i=(int)st r l e n (p)。re t ur n(0);/若不在,返回 0)/*将单个符号或符号串并入另一符号串*Ivoid m e r g e(c har*d,char*s,int t y p e)/是目的符号串,s 是源串,type=l,源串中的&一并并入目串;/typ e=2,源串中的&不并入目串i nt i,j;f o r(i=O;i=(int)st r len(s)-l;i+)if(t ype=2&si=&,);00e l s e(ooefor(j=0;j+)g e i f(j(i n t)s trie n(d)&s ij=d Ejj)-b reak;若已存在,则退出,继续看下一个源串字符go i f(j=(in t)strlen(d)若不存在,则并入000 16dj=s i ;。间 j+l=0,;川 。b reak;0)00)/*读入一个文法*/c h a r g r amm e r(c h a r*t,char*n,char*1 e ft,c ha r r igh t 5 0 5 0)(h a r vn50,vt 5 0;b c har s;charp5050;i nt i,j;p r i ntf(请输入文法的非终结符号串广);sc a n f(n%s v n);get c h ar();i=s t r len(vn);meme p y(n,vn,i);oni=z 0;opr i ntf(请输入文法的终结符号串:*);s c a n f(%s,v t);getchar();i=s tri e n(vt);mem c py(t,v t,i);print f(请输入文法的开始符号:);o s can f(%c ,&s);get c har():叩rin t f(“请输入文法产生式的条数:);scanf(d*,&i);g e tchar();cou n t=i;for(j=l;j=i;j+)(。p r in t f(请输入文法的第d 条(共d 条)产生式:,j,i);sc anf(%s,p!j-l);getch a r();f o r(j=0;j )/检测输入错误 (。p r i n t f(n 输入错误!);val i dity=O;return(0);)relu r n(s);)*判断读入的文法是否对的*/i nt judge()(i nt i,j;f o r(i=0;i=co u nt-l;i+)(。i f(i n(1 e f t E i,n on_te r)=0)若左部不在非终结符中,报错。p r intf(n n 文法左部犯错!、validity=O;oretum(O);00fo r(j=0;j=(i n t)s tr 1 e n(righ t i )-1 ;j+)。if(in(r i gh t i f j,n on_ter)=0&in(rig h t i j,t erm i n)=0&rightij 1)。(若右部某一符号不在非终结符、终结符中且不为,&,报错。printf(n文法右部犯错!”);gva 1 i di t y=0;。ret u r n(0);00 return(l);)/*求所有能直接推出&的符号*/v o i d emp(c h a r c)(c h ar t e m p 1 0;“nt i;fo r(i=0;iB,B可推出空)。r et u r n(1);。e Ise if(j=l&in(right i 0,termin)=l)右部长度为 1 但第一个字符为终结符,返回0(人-&为终结符)c o ntinu e;。e Ise00。f or(k=0;k AB)8。ma r k=l;0。if(m a r k=1)/找到的字符与当前字符相同(A A B)g o co n tinu e;/结束本次循环。oelse/(ma r k 等于 0)000b bb。f o r(k=O;k=j-l;k+)6 1。oresult*=_ e mp(righ t i k);/递归调用,查找右部符号是否可推出空字,把返回值赋给r e su 1 t。g tempO=r ig h ti k J;gg t e mp 1 =0merge(em p t,t e mp,l);把当前符号加入到临时数组empt 里,标记已查找i f(resu 1 t=0&icount)假如当前字符不能推出空字且还没搜索完所有的产生式,则跳出本次循环继续搜索下一条产生式cent i nue;e 1 se if(result=-l&icoun t)当前字符可推出空字,返 回 1re t urn(l);)*求单个符号的FIRST*/voi d fi r s t 2(int i)/i 为符号在所有输入符号中的序号ch a r c,temp20;o i n t j,k,m;c h ar ch-&;c=v i;0emp(ch);/求所有能直接推出空字的符号,结果保存到em p ty 口中if(in(c,termin)=l)/若为终结符-cdVT,则 FIRST(c)=c(f i rstliO=c;firs t 1 il=0;e l s e if(i n (c,n on_ t e r)=l)若为非终结符(f or(j=0 ;j =c ou nt 1 ;j +)U y为所有产生式中的序列00|i f(l e f t|j j=c)/找一个左部为c的产生式60。i f (in (r i ght j L O,t e r m i n)=l I I r i g h t j 0 =&)。/若产生式右部第一个字符为终结符或空.一产生式X-a(a V T)或Xf&,则把a或&加进F IR S T(X)t e m p 0 =r i g h t j 0 ;a。”e m p l =0。s m e r g e(f i r s t l i ,t e m p ,1);000/一_XfY lY 2 Y k的产生式,若Y 1 G V N,则 把F I R S T(Y l)中的一切非空符号加进 F I RST(X)。e 1 s e i f(i n(r i ght j 0 ,n o n _ t e r)=l)/产生式右部第一个字符为非终结符(。i f(r i ght j O=c)产生式右部的第一个符号等于当前字符,则跳到下一条产生式进行查找0 。c ont i n u e;。f or(k=0;k+)0-i f(v k =r i g h t j 0 )/求右部第一个字符在所有字符集中的位置k。2b 6b r e a k;000)000i f(fir s tflag k=O)。用 rst2(k):/求其 F I RST 集。=f i r s tflagkJ=T;标记其为查找状态00 0 me r ge(firstl i,f irstl k,2);求得结果并入到 X 的 FIRST 集.g f o r(k=O;k (in t)st r 1 e n(rig h t j);k+)00 0 ooempt0=0,;/存放到一个临时数组里,标记此字符已查找其是否可推出空字 o if(_ e mp(r i g ht j k)=1&k(i n t)s t rlen(r i ghtj)-l)。/当前产生式右部符号可推出空字,且当前字符不是右部的最后一个字符。f or(m=0;;m+)006 b 0 g-i f (Vm=rightj k+1)/获取右部符号下一个字符在所有字符集中的位置g。b r e ak;8 0)。Af(f i rstflagm =0,)假如此字符的FIR ST 集尚未查找,则找其FIRST集,并标其查找状态为100000 。boofi r st2(m);。first f 1 a g ml-T;0 6 001。merge(f i rs t li,f i r s t 1 m,2);/把求得结果并入到 X 的 FI R S T集.00)/一一产生式为X f Y l Y 2 Y k,若 对 一 切 I =i=0)/i不为-1 时是产生式的序号(。firs=&/把加入到当前符号串的FIRST集。f i rs ti 1=W;。e Is e/i 为-I 时,表达求FOLLOW时用到的产生式右部的FIRST集,保存在TEMP 口中00 O O O OTEMP0=,&1;。TEMPfllW;00)00。else/右部符号串字符不为“空字(。f o r(j=O;j+)OOd 8 i f(vj=p()/求右部符号的第一个字符p 0 在所有字符集中的位置j。由 e a k;3g i f(i=0)。m e mcp y(fi r s t i,f i rs t lj,str 1 en(f i rst 1 f j );/把 j 所指向的单个符号的FIRS T 集拷贝到该右部符号串的FIRST集。f i r s t i strlen(fi r s t l j)=0;)。els eg mem c p y(TEM P,first 1 j,s t r 1 e n(firstlfj);。TEM P s tr 1 en(firstlj)00)同se/假如右部为符号串(。f o r(j=0;;j+)(。if(Vj=p 0)/求右部符号的第一个字符p0在所有字符集中的位置j。w b r e ak;)i f(i=0)。me r ge(fir s t Li,fir s tlj1,2);。e l s ewmerg e(TEM P,f i rstl j,2);for(k=0;k=leng t h-l;k+)g e mpt 0=,0;g“fjemp(pk)=l&k=0)dootrnerge(first i,first 1 m,2);。e Is eo 。me r ge(TEMP,firstlm,2);00)else i f(_ em p(pk)=1&k=1 en g t h-1)。/当前右部符号串可推出空且是右部符号串的最后一个字符8。t e mp0=,。templ=0;o if(i=0)g 0m e rge(f irst i,te m p,1 );oooelsedoooi-nerge(TEM P,t em p,1);o e 1 se i f(_ e mp(p k)=0)gg b rea k;o)/*求各产生式左部的FOLLOW*/vo i d FO L LOW(int i)/参 数 i 为该符号在非终结符中的位置int j,k,m,n,res u lt=1;ochar c,t e mp 2 0;c=non_t e ri;/c 为待求的非终结符otemp0=c;“e mpl=0,;m ierge(fol 1 ,temp,l);把当前字符放到一临时数组fo il口 中,标记求已求其F O L L OW 集.避免循环递归if(c=s t a r t)/若为开始符号-开始符号S,则#eF O L LOW(S)otem p 0=#;temp 1=O;merg e(follow Li,temp,1);)fo r(j=0;j*&)的产生式gfor(k=0;;k+)。i f(r i ght j k=c)。b re a k;/k为c 在该产生式右部的序号,如 B在产生式A-a B 中的位置000 f o r(m=0;m+)b if(v m=left j)。obre a k;m为产生式左部非终结符在所有符号中的序号o e/假如c 在产生式右部的最后,形如产生式A f a B,则 FOLLOW(A)6F0LL 0W (B)i f(k=(int)strlen(right j)-1)(。if(in(vm,fol 1 )=1)查找该非终结符是否已经求过其F OLLOW集.避免循环递归。是则 FOLLOW(A)GFOLLOW(B)。merge(fol 1 ow i,follow m 1,1);把 c 所在产生式的左部非终结符的FOLLOW 集 力 口 入 至 lj FOLLOW(c)中。c o ntinu e;/结束本次循环,进入j+循环)。i f(f o 1 1 o wfl a gm=Oz)。假如该非终结符的FOLLOW未求过。FOLLOW(m);/求之 FO L L O W。fo 1 1 o w f 1 a g m=T ;/标记为 100merg e(fol 1 ow Li,fo 1 1 o w L /FO L L0W(A)GFOLLOW(B)。假如C不在产生式右部的最后,形如A-a B Boof o r(n=k+l;n*&)则 FOL LOW(A)eFOLLOW(B)if(in(vm,f oll)=l)-查找该非终结符是否己经求过其FOLLOW集.避免循环递归0m e r g e(fo 1 1 ow i,fol 1 o wm,1);/F 0 LLOW(A)仁 FOLLOW(B)ooooocon t inue;00 do|o i f(f o llowfla g m=,0*)8。FOL LOW(m);8。followf 1 ag m =r;6)me r ge(fol 1 owi,f o llowm,1);0 OD j/若 A f a B B淇中 B VN,a W(VT U VN)*、g e(VT U VN)+,则 FIR ST(8)e F OLLOW(B);000fo r(n=k+1;n=(i n t)str 1 en(r i g htj)-l;n+)t e mpn-k-l=ri g htjn;000)。tem p str 1 e n(r i g ht(j)-k-1 =O;FIR ST(-1,t emp);/求 FIRST(B)。o=me r g e(fo 1 I ow i,T E M P,2);把 F I R ST(8)中所有非空元素加入到FOLLOW(B)中000 J00)f o il owf 1 a g i =T;/标记当前规定的非终结符的FOL LOW集已求过)/*判断读入文法是否为一个LL(1)文法*/int LL1()(i nt i,j,1 e ngth,r e su 1 t=l;c h ar t emp50;for(j=0;j=4 9;j+)初始化“firs t j 0=0;fo 1 low j 0=,0;8 f i rstljO=O;s elec t j 0=0;TEMPLj=O*;。t empj=O,;firstflag j =(T;用来记录该字符的FIR ST集是否已求过.1 表达已求,0 表达未求ofol 1 ow f lagj =D;/用来记录该字符的FOLLOW 集是否已求过.1 表达已求,0 表达未求1f o r(j=0;j=(i n t)strle n(v)-1;j+)(frs t2(j);/求单个符号的FIRST集合,结果保存在firstl口 里opri n tf(u n 各非终结符推出的f i rst集:n );ofo r(j=0;j=(i nt)s tri e n(v)-1;j+)(pri n tf(%c:%s,vj,firstlfj);P rintf(n 能导空的非终结符集合:s n,em pty);p r intf(n_emp:”);of o r(j=0;j=(in t)s t rlen(v)-l;j+)p r intf(%d,_emp(v j);fb r(i=0;i=co u nt-l;i+)oFIRST(i,rig h t i);求 HRSTfor(j=0;jFOLLOW(j);)pri n tf(nfirst 集:”);afo r(i=0;i=c o u n t-1;i+)printf(s,first i );P r i n t f(”nfoUow 集合:”);fo r(i=0;i=(i n t)strlen(n o n t er)1;i+)。p r intf(H%s n,fol 1 ow i);ofor(i=0;i =count-l;i+)。/求每一产生式的SE L E C T 集合memcpy(sel e c ti,fi r st i,strle n(firsti);“first口存放的是各产生式右部的 FIRST 集sei e c ti strlen(first i)=,0,;fbr(j=O;j&s re s u 1 t=1;。if(r e su 1 t=1)0 for(j=0;;j+)o i f(vj =leftH)为 为左部符号在所有字符集中的位置go。bre a k;mer g e(s e le c t ij,f oliow j ,1);P rint f(unse 1 ec t 集合顺序是:);f o r(i=0;i=c o u n t 1;i+)eprintf(s,selecti);mem c p y(t e mp,s el e ct 0 ,s t r 1 en(s elect 0);t e mplstrlen(s e le c t 0)-0,;for(i=l;i =c o u n t 1;i+)/*判断输入文法是否为LL(1)文法*/le n g t h=strl e n(temp);oif(le f t i=1 efti-l)(。e rge(temp,s e 1 ec t i,1);woif(s t rlen(t e m p)return(1);)/*构造分析表M*/v oi d M M ()(i nt i,j ,k,m;f or(i =0 ;i =l 9;i +),f or(j=0;j =19;j+)初始化分析表,所有置为空(-1)8 M1;)i=s t r 1 e n(t e r m i n);t e r m i n i =#;/将#加入终结符数组t e r m i n i+l =0,;f or (i=0;i =c ou nt-l;i +)/查看每个产生式的 S E LE C T集 (fo r(m=0 ;m+)(i f(non_ t e r m =l e f t i )。b r e a k;m为产生式左部非终结符的序号0)f or (j=O;j s t ri=,ostri+l=,0,;S0=,#;aS l=start;S 2 =W;j=0;och=strj;w h i 1 e(l)(。i f(in(S s trlen(S)1,t erm i n)=1)i f(S st r len(S)-l!=ch)8。p rin tff该符号串不是文法的句型!)retur n;00 I s e i f(S s t rlen(S)-l=,#)printf(”该符号串是文法的句型.”);r eturn;00 else000 Sstrlen(S)-1=0;0000 j +;。ch=str Lj;e 1 se。f or(i=0;;i+)(non_ter i=Sstrlen(S)-1)e b rea k;for(k=0;k+)6(o if(t erm i nk=c h)a k;。if(k=(i nt)s trlen(t e rm in)sprint f(词法错误!”);s return;000 i f(M i k =-l)。叩rin tf(语法错误!);re t urn;。g els e(doorn=M Li k ;if(rightm 0=,)8s st r len(S)-1=0;o e 1 s eo o oop=s t rl e n(S)-1;。a q=p;g for(n=str 1 e n(rightm)l;n=O;n-)8g Sp+J=rig h t m n ;。S q+strl e n(r igh t m)=,0/;00000 10 0|p rintf(uS:%ss t r:M,S);fo r(p=j;p=(i n t)s tr 1 en(s t r)-l;p+)g p r i ntf(u%cn,s trp);叩 r intf(nn);0)/*一个用户调用函数*/v o id m e n u()(syn ta x ();叩 r intf(n n 是否继续?(y or nscanf(”c”,&choose);getcha r();o whil e(c h o o s e=,y)8 m enu();/*主函数*/void main()(int i,j;sta r t=g r am me r(term i n,non_ ter,left,ri g ht);/读入一个文法pr i n tf(ncount=%d,cou n t);opri n t f(nn 开始符号为:%c,s ta r t);t r cp y(v,non_ ter);strcat(v,termi n);printf(n 所有符号集为:%s ,v);printf(n 非终结符集合:%s“,none r);pri n t f(“);prin t f(u n 终结符集合:%s n,t e rm in);叩rin t f(H);op rint f(”n 文法所有右边表达式依次是:);ofbr(i=0;i=c ount-1;i+)。(p rintf(s n,r i ght i );pr i ntf(Hn 文法所有左边开始符依次是f o r(i=0;i=cou n t-l;i+)。pr i n tf(n%c H,le f ti);)if (validity=l)wal i d ity=j udge();printf(n v a 1 idi t y=%d,v a 1 id i ty);“f(v alidity=l)(11=LL1();print f(un 1 1=%d,1 1);i f(H=O)一、1耳“11该文法不是一个1 4 文法!”);else(。叩rin tf(”n 该文法是一个L L(1)文法!);MM();printf(nn);。f or(i=0;i=19;i+)e fo r(j =0;j=0)o p r intf(“M%d%d=%d M i j);。“m e n u();)-G:编译)语 法 分 隔 DebugE20814124.exe-=1 回sbe$:aS-ABS-bCA-&A-bB-&B-aDC-ADC-bD-aSD-c-+二 17+二-u-a-u-t-E:产产产产产产产产产产X70JZs)/JZs)z1/JZJ/!/-xs:000000 0 0 0 1幺一幺-力J1234567891濠开生第第第第第第第第第第Is二|4.二(SY14*4-Is-Is二-JJ二14.二Is二Is二14.二Is二二Is二法法法法法法法法法法法法法法勺:SABCDabc:If irstD:a集:Ab:b c:c0 0 0 0 0 0由于算法仍有很多错误,最终结果没能实现,这点很失望!五、实验心得通过本次实验,我收获了很多东西。一方面对编译原理这门课有了进一步的深刻理解,同时对LL(1)文法分析的原理和过程有了进一步的巩固,也锻炼了我编程的能力,巩固了平时所学的知识,真正做到了学以致用。在做实验的过程中,发现自己在编写程序过程中,总是会忽略各种细节,从而导致经常修改一些很小的低档错误才干使程序正常运营,不仅浪费时间,还影响对其他地方的修改,并且在很多环节解决上,方法不对的。使结果不能符合规定,深刻体会到了自己在编程方面与别人的差距,在此后的学习中,我会注意改正自己在这方面的缺陷,促使自己的编程水平不断进步。编译原理是一门专业学科,对于现阶段的我来说,只能掌握它的一些基本原理和概念,对于一些更深层的知识还是有很多难以理解的地方。但在这次实验过程中,锻炼了自己的思考能力,也锻炼了自己的动手编程能力,对于将知识的转化有了很大的帮助。