实验二--LL(1)分析法实验报告全文共11页,当前为第1页。实验二--LL(1)分析法实验报告全文共11页,当前为第1页。实验二 LL(1)分析法 实验二--LL(1)分析法实验报告全文共11页,当前为第1页。 实验二--LL(1)分析法实验报告全文共11页,当前为第1页。 实验目的 通过完成预测分析法的语法分析程序,了解预测分析法和递归子程序法的区别和联系。使学生了解语法分析的功能,掌握语法分析程序设计的原理和构造方法,训练学生掌握开发应用程序的基本方法。有利于提高学生的专业素质,为培养适应社会多方面需要的能力。 二、实验内容及设计原理 所谓LL(1)分析法,就是指从左到右扫描输入串(源程序),同时采用最左推导,且对每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。实现LL(1)分析的程序又称为LL(1)分析程序或LL1(1)分析器。 我们知道一个文法要能进行LL(1)分析,那么这个文法应该满足:无二义性,无左递归,无左公因子。当文法满足条件后,再分别构造文法每个非终结符的FIRST和FOLLOW集合,然后根据FIRST和FOLLOW集合构造LL(1)分析表,最后利用分析表,根据LL(1)语法分析构造一个分析器。LL(1)的语法分析程序包含了三个部分,总控程序,预测分析表函数,先进先出的语法分析栈,本程序也是采用了同样的方法进行语法分析,该程序是采用了C++语言来编写,其逻辑结构图如下: LL(1)预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a做哪种过程的。对于任何(X,a),总控程序每次都执行下述三种可能的动作之一: (1)若X = a ='#',则宣布分析成功,停止分析过程。 (2)若X = a '#',则把X从STACK栈顶弹出,让a指向下一个输入符号。 (3)若X是一个非终结符,则查看预测分析表M。若M[A,a]中存放着关于X的一个产生式,那么,首先把X弹出STACK栈顶,然后,把产生式的右部符号串按反序一一弹出STACK栈(若右部符号为ε,则不推什么东西进STACK栈)。若M[A,a]中存放着"出错标志",则调用出错诊断程序ERROR。 三、程序结构描述 实验二--LL(1)分析法实验报告全文共11页,当前为第2页。实验二--LL(1)分析法实验报告全文共11页,当前为第2页。 实验二--LL(1)分析法实验报告全文共11页,当前为第2页。 实验二--LL(1)分析法实验报告全文共11页,当前为第2页。 1、定义的变量 初始化预测分析表: LL E[8]={"TG","TG","error","error","error","error","error","error"}; LL G[8]={"error","error","null","+TG","-TG","error","error","null"}; LL T[8]={"FS","FS","error","error","error","error","error","error"}; LL S[8]={"error","error","null","null","null","*FS","/FS","null"}; LL F[8]={"i","(i)","error","error","error","error","error","error"}; const int MaxLen=10; 初始化栈的长度 const int Length=10; 初始化数组长度 char Vn[5]={'E','G','T','S','F'}; 非终结符数组 char Vt[8]={'i','(',')','+','-','*','/','#'}; 终结符数组 char ch,X; /全局变量,ch用于读当前字符,X用于获取栈顶元素 char strToken[Length]; 存储规约表达式 2、定义的函数 class stack 栈的构造及初始化 int length(char *c) 输出字符数组的长度 void print(int i,char*c) 剩余输入串的输出 void run() 分析程序 3、LL(1)预测分析程序流程图 实验二--LL(1)分析法实验报告全文共11页,当前为第3页。实验二--LL(1)分析法实验报告全文共11页,当前为第3页。 实验二--LL(1)分析法实验报告全文共11页,当前为第3页。 实验二--LL(1)分析法实验报告全文共11页,当前为第3页。 四、程序源代码及运行结果 #include<iostream> using namespace std; const int MaxLen=10; //初始化栈的长度 const int Length=10;//初始化数组长度 ch