计算机编译原理实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

<6,i> <4,=> 〈5.0) <6,i> <3,++> <6,a> <4,<=> Error Error <2,>> <2,;>

关标天常关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 analysis用来存放分析栈;

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]存放输入串;

相关文档
最新文档