2023年语法分析器实验报告.pdf
《2023年语法分析器实验报告.pdf》由会员分享,可在线阅读,更多相关《2023年语法分析器实验报告.pdf(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、语法分析器的设计实验报告一、实验内容语法分析程序用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、语法分析器实现语法分析是编译过程的核心部分,它的重要任务是按照
2、程序的语法规则,从由词法分析输出的源程序符号串中辨认出各类语法成分,同时进行词法检查,为语义分析和代码生成作准备。这里采用自顶向下的LL(1)分析方法。语法分析程序的流程图如图5-4所示。语 法 分 析 程 序 流 程 图该程序可分为如下几步:(1)读入文法(2)判断正误(3)若无误,判断是否为L L(1)文法(4)若是,构造分析表;(5 )由句型判别算法判断输入符号串是为该文法的句型。三、核心思想该分析程序有1 5部分组成:(1)一方面定义各种需要用到的常量和变量;(2)判断一个字符是否在指定字符串中;(3 )读入一个文法;(4)将单个符号或符号串并入另一符号串;(5)求所有能直接推出&的符
3、号;(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
4、 为空符号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、计算每个
5、符号的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 产生式右部的第
6、一个符号等于当前字符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,若对一切
7、 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)
8、结束本次循环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集(一切非空元素,不涉及)放入到当前产生式
9、的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 指向的
10、当前产生式的左部等于上一条产生式的左部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
11、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;记录可推
12、出&的符号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 e
13、turn(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+)
14、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
15、(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 条(
16、共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 t
17、r 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&
18、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
19、 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);/
20、求所有能直接推出空字的符号,结果保存到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
21、-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 。
22、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,;/存放到一个临时数组里,标记此字符
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 语法 分析器 实验 报告
限制150内