编译原理实验报告 - 词法分析器和LL文法 下载本文

内容发布更新时间 : 2024/11/15 20:24:08星期一 下面是文章的全部内容请认真阅读。

} } length=i;//text最后一个字符是空字符 fclose(fp); //关闭文件 scan(); for(i=0;i

9

开课实验室:C210 2016年 12月 8日 实验题目 语法分析——LL(1)语法分析方法的实现 一、实验目的 通过设计、开发一个高级语言的LL(1)语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容(包括自顶向下语法分析、First集、Follow集、Select集、判断LL(1)文法的方法、文法等价变换、LL(1)分析表的构造、对某一输入串的分析过程的理解,提高语法分析方法的实践能力。 二、实验要求 消除直接左递归前的文法 消除直接左递归后的等价文法 G [E]:E→E+T G’[E]: E→TE’ E→T E’→+TE’|ε T→T*F T→FT’ T→F T’→*FT’|ε F→(E)|i F→(E)|i 根据文法建立LL(1)分析表,并对输入串i+i*i进行语法分析,判断其是否是合法的句子,给出句子的分析过程。 具体要求如下: 1、理解语法分析在编译程序中的作用; 2、理解LL(1)语法分析方法对文法的要求(必须是LL(1)文法); 3、理解LL(1)分析器模型; 4、熟练掌握文法变换方法(消除直接左递归和提取左公共因子)。 5、熟练掌握Select集合的求解方法和LL(1)分析表的构造方法; 二、实验设备与环境 1.硬件:PC机Pentium100以上。 2.软件:Win10,VS2010。 三、实验内容 给定一个上下文无关文法G,在LL(1)语法分析方法中,必须先求出Select集,通过Select集判断是否是LL(1)文法,若是,则构造预测分析表。求出预测分析表之后,键盘输入一个字符串,依据LL(1)分析表单步输出字符串的分析过程。 四、实验步骤

10

输入字符串 和初始符号栈 符号栈大小 N 大于等于0? Y Y N 待分析字符 栈顶字符是否为合法字 Y N 符? 是否为合法字符? 待分析字符是 N Y 否和符号栈栈 对照分析表判断采用产生式 顶字符相等? 待分析字符 Y 为空? 弹出栈顶符号,不压入栈 和栈顶字符同时为“#” 分析成功 Y N 产生式右部 匹配分析字符分析下一个字符 N 五、实验结果及分析 弹出栈顶符号,产生式右部逆序入栈 修改栈大小 修改栈大小 11

六、实验小结和思考 本实验加深了我对 LL(1)分析法的算法和思想的理解。 七、源程序清单 #include #include #include #include /*1:E->TE' 2:E'->+TE' 3:E'->ε? 4:T->FT' 5:T'->*FT' 6:T'->ε? 7:F->(E) 8:F->i*/ int ll1[5][6]={{1,0,0,1,0,0}, {0,2,0,0,3,3}, {4,0,0,4,0,0}, {0,6,5,0,6,6}, {8,0,0,7,0,0}};//表示LL(1)分析表内容 int main() { char ch[10]={'#','E'}; //用于存放符号栈内容 char str[10]; //存放输入串 char str1[10]; //用于存放最初输入的字符串 char cha; //分析字符 int i,j,m,n; //j:终结符所代表数字;m:非终结符所代表数字;n:产生式右部大小

12