实验二 LL(1)分析法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二LL(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。
三、程序结构描述
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)预测分析程序流程图
四、程序源代码及运行结果
#include
using namespace std;
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];//存储规约表达式
struct LL//ll(1)分析表的构造字初始化
{
char*c;
};
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"}; class stack//栈的构造及初始化
{
public:
stack();//初始化
bool empty() const;//是否为空
bool full() const;//是否已满
bool get_top(char &c)const;//取栈顶元素
bool push(const char c);//入栈
bool pop();//删除栈顶元素
void out();//输出栈中元素
~stack(){}//析构
private:
int count;//栈长度
char data[MaxLen];//栈中元素
};
stack::stack()
{
count=0;
}
bool stack::empty() const
{
if(count==0)
return true;
return false;
}
bool stack::full() const
{
if(count==MaxLen)
return true;
return false;
}
bool stack::get_top(char &c)const
{
if(empty())
return false;
else
{
c=data[count-1];
return true;
}
}
bool stack::push(const char c)
{
if(full())
return false;
data[count++]=c;
return true;
}
bool stack::pop()