实验二 LL(1)分析法实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()

相关文档
最新文档