计算机编译原理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告
实验一词法分析设计
一、实验功能:
1、对输入的IXt文件内的内容进行词法分析:
2、由文件流输入IesiJxi中的内容,对文件中的各类字符进行词法分析
3、打印出分析后的结果;
二、程序结构描述:(源代码见附录)
1、分别利用k[],siu,s2[],s3[]构造关键字表,分界符表,算术运算符表和关系运算符表。
2、bool isletter(){}用来判断其是否为字母,是则返回IrUe,否则返回false;
bool isdigit(){)用来判断其是否为数字,是则返回IrUe,否则返回false;
bool iscalcu(){)用来判断是否为算术运算符,是则返回IrUe,否则返回false;
bool reserve(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
Process exited after 2.503 seconds with return
信按任意键继续∙.∙
四、实验总结
词法分析器一眼看上去很复杂,但深入的去做就会发现并没有一开始想象的那么困难。 对于一个字符的种别和类型可以用b∞l 函数来判断,对于关键字和标示符的识别(尤其是 3b)则费了一番功夫,最后对于常数的小数点问题处理更是麻烦。另外,这个实验要设定好 时候退格,否则将会导致字符漏读甚至造成字符重复读取。
我认为,这个实验在程序实现上大体不算困难,但在细节的处理上则需要好好地下功夫 去想,否则最后的程序很可能会出现看上去没有问题,但实际上漏洞百出的状况。
将学过的知识应用到实际中并不简单,只有自己不断尝试将知识转化成程序才能避免眼 高手低,对于知识的理解也必将更加深刻。
单词
*******分析结果如下美 二元序列 类型
then
+ +
3b
关标天常关OW ⅛:
天ErEr 八芬
键识系匿识术识系rorr 字
符运字符运符
运r O B-Tnvp
1%E,E--? 符符
算算
位置
<1,1> <1,2> <1,3〉 <1,4〉 <1,5> <1,6〉 <1,7〉 <2,1> <2,2〉
《2,3》
<2,4) <2,5〉 value 0
实验二LL(I)分析法
一、实验原理:
1、写出LL(I)分析法的思想:当一个文法满足LL(I)条件时,我们就可以为它构造一个不带回溯的自上而下的分析程序,这个分析程序是有一组递归过程组成的,每个过程对应文法的一个非终结符。实现LL(I)分析的一种有效的方法是使用一张分析表和一个站进行联合控制。预测分析表是一个M[A,a]形式的矩阵,存储着分析规则;栈STACK用于存放文法符号。从栈顶取符号,按照分析表给出的规则进行有步骤的分析。
2.实验要求实现的文法:
(1)E->TG
(2)G->+TG∣-TG
(3)G->ε
(4)T->FS
(5)S->*FS∣∕FS
(6)S->ε
(7)F->(E)
(8)F->i
二、程序结构:
SlringM⑸⑻用来定义分析表:
CharinPUl[50]用来存放输入的句子;
vector
bool flag = true用来判断是否成功的标志;
reference(char a,char i){)查询分析表,其中a为分析栈顶符号,i为输入串符号;pro(char a,char in){)用以做出具体的分析;
LL(I)依测分析程序流程
三、实验结果:
运行程序,输入需要分析的语句,结果如下:
四、实验总结:
本次试验用代码实现了LL(I)文法,在过程中对于非终结符向终结符转换的过程中出现了一些问题,之后通过向同学请教得已解决。
本代码中的分析表写在了主函数中,可以说本程序只对这一个文法有效,这也是这个程序的局限性。
实验三LR(I)分析法
一、实验原理
LR (1)分析法实验设计思想及算法
(1)总控程序,也可以称为驱动程序。对所有的LR分析器总控程序都是相同的。
(2)分析表或分析函数,不同的文法分析表将不同,同一个文法采用的LR分析器不同时,分析表将不同,分析表又可以分为动作表(ACTlON)和状态转换(GoTo) 表两个部分,它们都可用二维数组表示。
(3)分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。
分析器的动作就是由栈顶状态和当前输入符号所决定。
二、程序结构
action[12][6]定义动作表;
go[12][3]定义转换表:
input[50]存放输入串;