编译原理实验报告 合肥工业大学计算机科学与技术 完成日期:2 0 1 3 .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、对于关系运算符用 sw itch 结构进行选择判断即可解决一个字符和两个字符的运算符之间的差异; 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 ...