编译原理实验报告
合肥工业大学计算机科学与技术
完成日期:2013.6.3
实验一 词法分析设计
一、实验功能:
对输入的txt文件内的内容进行词法分析: 由文件流输入test.txt中的内容, 对文件中的各类字符进行词法分析 打印出分析后的结果;
二、程序结构描述:(源代码见附录)
1、利用Key[]进行构造并存储关键字表;利用optr[]进行构造并存储运算符表;利用separator[]进行构造并存储分界符表;
2、bool IsKey(string ss) {}判断是否是关键字函数若是关键字返回true,否则返回false;
bool IsLetter(char c) {}判断当前字符是否字母,若是返回true,否则返回false;
bool IsDigit(char c) {}判断当前字符是否是数字,若是返回true,否则返回false;
bool IsOptr(string ss) {}判断当前字符是否是运算符,若是返回true,否则返回false; bool IsSeparator(string ss) {}判断当前字符是否是分界符,若是返回true,否则返回false; void analyse(ifstream &in) {}分析函数构造; 关系运算符通过switch来进行判断;
三、实验结果
实验总结:
词法分析的程序是自己亲手做的,在实现各个函数时花了不少功夫,
1、要考虑到什么时候该退一字符,否则将会导致字符漏读甚至造成字符重复读取。
2、在实现行数和列数打印时要考虑到row++和line++应该放在什么位置上才可以,如当读取一个\\n时line要增加一,而row需要归0处理,在读取某一字符串或字符后row需要加一;
3、对于关系运算符用switch结构进行选择判断即可解决一个字符和两个字符的运算符之间的差异;
4、将自己学过的知识应用到实践中是件不怎么容易的事情,只有亲身尝试将知识转化成程序才能避免眼高手低,对于知识的理解也必将更加深刻。
实验二 LL(1)分析法
一、实验原理: 1、写出
LL(1)分析法的思想:当一个文法满足LL(1)条件时,我们就可以
为它构造一个不带回溯的自上而下的分析程序,这个分析程序是有一组递归过程组成的,每个过程对应文法的一个非终结符。实现LL(1)分析的一种有效的方法是使用一张分析表和一个站进行联合控制。预测分析表是一个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
二、程序结构:
各个模块:
(1)定义部分:定义常量、变量、数据结构。
(2)初始化:设立LL(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);
(3)控制部分:从键盘输入一个表达式符号串;
(4)利用LL(1)分析算法进行表达式处理:根据LL(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。
程序各个部分的实现:
(1)Vn[]存储非终结符数组; Vt[]存储终结符数组;
char strToken[Length];//存储规约表达式
struct LL//ll(1){char *c}分析表的构造字初始化
Class stack实现栈的要求功能:初始化,判断空满,入栈出栈等;
Run()函数实现LL(1)文法分析的函数:先将表达式字符入栈,#最先入栈底,依次取栈顶

