《计算机编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《计算机编译原理实验报告.docx(20页珍藏版)》请在第一文库网上搜索。
1、编译原理实验报告实验一词法分析设计一、实验功能:1、对输入的IXt文件内的内容进行词法分析:2、由文件流输入IesiJxi中的内容,对文件中的各类字符进行词法分析3、打印出分析后的结果;二、程序结构描述:(源代码见附录)1、分别利用k,siu,s2,s3构造关键字表,分界符表,算术运算符表和关系运 算符表。2、bool isletter()用来判断其是否为字母,是则返回IrUe,否则返回false;bool isdigit()用来判断其是否为数字,是则返回IrUe,否则返回false;bool iscalcu()用来判断是否为算术运算符,是则返回IrUe,否则返回false;bool rese
2、rve(string a)用来判断某字符是否在上述四个表中,是则返向InIe,否则返 回 false;void concat()用来连接字符串;void getn()用来读取字符;void getb()用来对空格进行处理;void retract()某些必要的退格处理;int analysis()对一个单词的单词种别进行具体判断;在主函数中用switch决定输出。3| file.txt -记事本文件(F)编辑格式(O)查看(V) W(H)if i = O then i +; a = 3b%);富F:cpp词法分析器.exe单词*分析结果如下美二元序列类型then+ +3b 5.0) 4, Er
3、ror Error 关标天常关OW:天ErEr八芬键识系匿识术识系rorr字符运字符运符运rO B-Tnvp 1%E,E-?符符算算位置1,31,41,61,72,22,32,4)2,5TG(2) G-+TG-TG(3) G-(4) T-FS(5) S-*FSFS(6) S-(7) F-(E)(8) F-i二、程序结构:SlringM用来定义分析表:CharinPUl50用来存放输入的句子;vector analysis用来存放分析栈;bool flag = true用来判断是否成功的标志;reference(char a,char i)查询分析表,其中a为分析栈顶符号,i为输入串符号; pr
4、o(char a,char in)用以做出具体的分析;LL(I)依测分析程序流程三、实验结果:运行程序,输入需要分析的语句,结果如下:3 F:cppLL(l).exeD 5) IlWlB入语句,以*结束:ii*iH分析栈RE剩余输入串i+i*itt所用产生式辘化ttGTi*i*ittE-TGPOP,PUSHTGMGSFi*i*ittT-FSPOP,PUSHFSKGSii+i*i#F-iPOP,PUSHiItGS+i*ittGETNEXTRG*i*ittS-POPBGT +ii#G-+TGPOP,PUSH+TGItGTi*ittGETNETJtGSFi*ittT-FSPOP,PUSHFSttGS
5、iii#F-iPOP,PUSHiUGS*ittGETNEXTMGSF*iS-*FSPOP,PUSH*FSJtGSFi#GETNEXTUGSiittF-iPOP,PUSHiNGSItGETNETttGttS-POPttttG-POP分析己王部元成Process exitedafte* 6.336seconds with returnvalue 0三氢键士或.J四、实验总结:本次试验用代码实现了 LL(I)文法,在过程中对于非终结符向终结符转换的过程中出 现了一些问题,之后通过向同学请教得已解决。本代码中的分析表写在了主函数中,可以说本程序只对这一个文法有效,这也是这个程 序的局限性。实验三LR(
6、I)分析法一、实验原理LR (1)分析法实验设计思想及算法(1)总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。(2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器 不同时,分析表将不同,分析表又可以分为动作表(ACTlON)和状态转换(GoTo) 表两个部分,它们都可用二维数组表示。(3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。分析器的动作就是由栈顶状态和当前输入符号所决定。二、程序结构action126定义动作表;go123定义转换表:input50存放输入串;referaction(int s,char i)查询action表,
7、a为分析栈顶的状态,i为输入串的符号;refergo(int s,char i)查询 go 表;reduce(int n) J 就近规约:analysis(int st,char in)( J 具体分析:LR分析器结构:其中:SP为栈指针,Si为状态栈,Xi为文法符号栈。状态转换表用 GOTOi, X=j表示,规定当栈顶状态为i,遇到当前文法符号为X时应 转向状态j, X为终结符或非终结符。 ACTIONi, a规定了栈顶状态为i时遇到输入符号a应执行。动作有四种 可能:(1)移进:actioni, a= Sj:状态j移入到状态栈,把a移入到文法符号栈,其中i,j表 示状态号。(2)归约:ac
8、tioni, a=rk:当在栈顶形成句柄时,则归约为相应的非终结符A,即文法中有A- B的产生式,若B的长度为R(即IBI=R),则从状态栈和文法符号栈中自顶向下去掉R个符号,即栈指针SP减去R,并把A移入文法符号栈内, j=GOTOi,A移进状态栈,其中i为修改指针后的栈顶状态。(3)接受 acc:当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即 当前输入符是#,则为分析成功。(4)报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输 入端不是该文法能接受的符号串。用IP指向W#的第一个得号“的心止Ss圮Nfs分别人 箝号枝和状态枝: 使桢蔺济TrF一个
9、a是ip所搐向的桁号分别从桂BW出W个 符号,令s是当前桂Bi状轰 JRa 和先讯T入桂中.S出产生或A0.出幡处”三、实验结果:输入需要规约的字符串,结果如下:辄i入哈句,L)述箔束:i+i*it 符号栈005nHi03#F02#T01ItE016#E+0165ttE*i0163E*F0169#E+T01697ttE*T*016975ttE*T*i0169710ttE+T*F0169#E*T01ttE F:cppLR(l).exe剩余输入串 ii*itt +iitt +i*i# +i*i i*itt i*i#*itt *itt*itt itt tt tt It tt力 5 642656475
10、 s PrrSSrrSSr6r3rlACM约约约归卷 5归归归65归归75归*F蒜 iF态态 XF态态ixE丽 P-T-奈F-T-菜F-T-E-汤G0T0=3GOTO=9GOTO=10 ,GOTO=9 ,GOTO-1GOTO-3GOTO=2GOTO=1Process exited after 8.325 seconds with return ualue 0 请按任意键继续.四、实验总结1、与算符优先分析方法比较,用LR分析时,设计特定出错处理子程序比较容易,因为不 会发生不正确的归约。在分析表的每一个空项内,可以填入一个指示器,指向特定的出错处 理子程序,第一类错误的处理一般采用插入、删除或
11、修改的办法,但要注意,不能从栈内移 去任何那种状态,它代表已成功地分析了程序中的某一部分。2、LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程。LR 分析法正是给出一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入 串的K个(KeO)符号就可唯一地确定分析器的动作是移进还是归约和用哪个产生式归约, 因而也就能唯一地确定句柄。其中LR(O)分析器是在分析过程中不需向右查看输入符号,因 而它对文法的限制较大,然而,它是构造其它LR类分析器的基础。因此,首先应学好LR(O) 项目集规范族构造的基本原理和方法。当K=I时,已能满足当前绝大多数高级语言编译程 序实现的需要。SLR(I)分析是为学习LR(I)分析做准备,LR(I)项目集族的构造是LALR(I) 分析器的构造原理和基础。LALR(I)分析器是当前大多数高级程序设计语言编译程序所采 用的语法分析技术,也是编译程序语法分析器自动构造工具YACC的实现基本原理。由此, LR(0)、SLR(1 ) LALR(I). LR(I)四种分析器的构造方