编译原理实验报告四_第1页
编译原理实验报告四_第2页
编译原理实验报告四_第3页
编译原理实验报告四_第4页
编译原理实验报告四_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理实验报告题 目 表达式语法分析程序的构造学 院专 业班 级学 号 学生姓名指导教师西安思源学院教务处制实验四表达式语法分析程序的构造一、实验目的1掌握c+语言编译的语法分析程序2 分别掌握ll(1)、算符优先、lr等语法分析方法的构造。二、实验环境microsoft visual c+ 6. 0三、实验内容给定某一文法,试构造其简单优先矩阵(或1±(1)矩阵),并编制程序。 给出相应句子的语法分析过程,判其正确性。例如:给定文法g:e->t elel+te1 / et-ft1tlf *f / ef->id/ (e)(1) 先构造其select集合,判定其是否为ll

2、文法(2) 是则构造其分析表(3) 给出句子id+id*id$的语法分析过程四、设计说明ll(1):#include<stdio.h>#include<str i ng>typedef int datatype;char an3 = ,$t/e,);charcn4二r $:,才,+',才 fffj fchar*bn1n2 = / /f/z/ / /99“*(,)z,,e”xt ,/ / / /丁 /xt ,. x,t"xt+,”", 1ffz,t ,/ l"yf , tf l yf .,/ / y ,/ /f/ l ,yf* f/

3、/ / / / /fff/ / z ,/ / / /tf)e(:“;void fxb()int i, j;cout«/z分析表为:,«end i;for(i=0;i<n1;i 卄)for(j=0;j<n2;j 卄) (cout«bij«/z cout«endi ;)void wf()(int s;char *w5 = z/e->te' ", "ette,/e", "t->f”、"t ->*f/e", "f-> (e)/i d&quo

4、t; cout«/z文法为:/z«end i ;for (s=0; s<5; s卄)cout«ws «end i ;)void select()cout«/,select 集合为:zz«end i ;cout«z,1. seiect(e->te )=first(te* ) = (, id)"<<endi ;cout«/z2. se i ect (e' ->+te' )=f i rst (+te') = + "<<end i;cou

5、t«/z3. seiect (e ->e) =first(e)ufollow(e )-e) = ($,)"<endi;cout«/z4. seiect (t-ft') = (, id /z«endi;cout<<"5. seiect(t' ->*f) = *"<<endi;cout«/z6. se i ect (t* ->e) = +,), $),«end i ;cout«z/7. se i ect (f-> (e) = (),z

6、71;end i ;cout«/z8. se i ect (f-> i d) = i d)/z«end i ;cout«z/为 ll (1)文法z,«end i ;)void showa ()(int i ;cout«,/分析栈为:z,«end i;for(i=0; i<n3; i卄)(i f (ai ! =0) cout«ai ;cout«end i ;void showb() int j;cout«z,输入流为:"<<end i ;for(j=0;j<n4;j+

7、)if (cj !二null)cout«cj ;cout«end i ;1void fx()cout«z,分析如下:"<<endl ;showa () ; showb ();int i, j, m, n;i = l 0 ; j=j 0 ;m=m () ; n=n ();whi le (am !=*$*)if (am !=cn)&&(bi j !二null)am=bijo;am+1二 bijl;am+2=bi j 2;showa () ; showb () ; m=m () ;n=n ();if (am=cn) ( else m

8、=m() ;n=n() : i = l () ; j=j0 ;else if (a m =cn)a m =null; c n =null; showa () ; showb ();m=m() ;n=n() ; i = l () ; j=j 0 ;)1void main()(wf() ;select() ;fxb();fx();)算符优先:void main() int i, j,k=o;printfc请输入文法规则数:");scanf&r);printf c请输入文法规则:n");for (i=0; i<r; i 卄)scanf ("%s"

9、, sti);/存储文法规则,初始化firstvt集和lastvt集 firsti0=0;/*firsti0和 last订0分别表示 sti0非终极符的 firstvt 集和 lastvt 集中元素的个数*/lasti0=0;for (i=0; i<r; i+)判断文法是否合法for(j=0;sti j!二'0' ; j+)if(sti0'a' | |sti0>'z')printfc不是算符文法!n") ;exit(-l)汀if (sti j>=, a' &&sti j<=, z'

10、)if(stij+l>= a'&&stij+l<= z')printf ("不是算符文法! n") ; exit (-1);)for(i=0;i<r;i+)for(j=0;sti j != 0' ; j+)if(stij<'a |stij>'z')&&stij!='-'&&stij!=' >'&&stij!二'i')tablek+=sti j;lablek=, #' ;la

11、blek+l=, 0* ; table (); printf ("每个非终结符的firstvt集为:n"); for(i=0;i<r;i+) printf (*%c: ", stio);for (j=0;j<firsti0;j+)printf(*%cfirstij+1);printf ("n");printf f每个非终结符的lastvt集为:n"); for (i=0;i<r;i+)/输出每个非终结符的firstvt集/输岀每个非终结符的lastvt集printf (,z%c:sti 0);for(j=0;j<

12、;lasti0;j+)printf (*%c ", last订j+1); printf("n");printf c算符优先分析表如下:n");for(i=0;lableti0' ;i+)printf(*t%c*, lablei);printf("n");for (i=0;i<k+l;i+)printf("%ct",lablei);for(j=0;j<k+l;j+)printf(*%ct*>dataij); printf("n");printfc请输入文法输入符号串以#结

13、束:"); scanfinput);deal ();int deal () int i, j;int x, y;int z;k=l;s k二'#'for(i=0;inputi!- 0' ;i+);/输入串的长度栈置初值计算输入串的长度i=0;while(a=inputi)!二'0') if(zhongjie(sk)elsej=k-l;x=xiabiao(sj);y=xiabiao(a);if (datax y=,>') out(l, k, s);printf("%c", a);out (i+1, z, inpu

14、t);printf (*规约n");do q=sj;if(zhongjie(sj-l)j=j-l;else j=j-2;x=xiabiao(sj);y=xiabiao(q);while(datax y !='<');int m, n, n;for(m=j+1;m<=k;m+)for(n=0;n<rl;n+)for(n=l;stringnn!=, 0' ;n+)if(!zhongjie(sm)&&!zhongjie(stringnn)if(zhongjie(sm+1)&&zhongjie(stringnn+1)&

15、amp;&sm+l=stringn n+1)sj+l=stringn0; break;elseif(zhongjie(sm)if(sm=stringnn)sj+l=stringn0; break;)k=j+l;if (k=2&&a=, #') out (1, k, s); printf ("%c", a); out (i+1, z, input);printf ("结束n"); printff输入串符合文法的定义! rt);return 1;输入串符合文法的定义elseif(dataxy='t | data xy=

16、'=')移进out (1, k, s);printf ("%c", a) ;out (i+1, z, input) ;printf ("移进n");k+;sk=a;i+;elseprintf("nflase");return 0; ) printf("nflase");return 0;slr (1):void main() string a129二"s5","e","i e t s6 rm”"e","s5",

17、 "e""e","r6"s5 er zz “ frl e t s6r. e , r1"e","r3""e", "r5"string s7 = r,/e6 e2,t6:t2: "f6, f2e , s b , e , ./ . /e , rl t r1 ,e , r3 , r3 ,仁2,3)e t e t e , "e", "e",e t e t e ), ,,8 2, ”3,/ / / / / 1etete

18、,ef9f3.e,e,aetete), e.e).ete,e.eh ;e ,/ /e ,char c, cc;. string myss=;int f i ag=0;/看数字或标示符是否结束i i st<char> ss, i i;i i st<char>:iterator my it;cout«z,请输入要分析的表达式:"endl ;wh i i e (c二getchar () !=* n') flag=0;wh i le(isdigi t (c) | | i sa i pha (c) f lag二 1 ;c=getchar ();)i f

19、 (f i ag) ss. push_back (' i');if (c='n)break;ss. push_back (c);)ss. push_back (*$'); i i. push_back ('$'); i i. push_back (' o'); wh i le(1)(if (get (ss. front () !=-1)/输入栈myss=a get i (i i. back () get (ss. front ();eise cout«,/错误! ,«endl;break;if (myss. at (0)='s') i i. push_back (ss. front () ;/i 进入ss. pop_front () ;/将 i 删除i i push-back(myss at (1);/5进入)e i se i f (myss. at (0)=' r*) for(int i=0;i<smyss. at(1)-48. at(1)-48;i+)i i. pop_back () ;/出栈 n 位cc=ll.back (); /保存当前状态i i. push_back (s myss. at (1)-48. at (0) ;/大写字母i i. push_bac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论