计算机理论导引实验报告2-上下文无关文法(CFG)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HUNAN UNIVERSITY

计算理论导引实验报告

题目:上下文无关文法(CFG)学生姓名:

学生学号:

专业班级:计算机科学与技术2班

上课老师:

实验日期:2014-1-5

一、实验目的 (2)

二、实验内容.......................................................................................... 错误!未定义书签。

三、实验代码.......................................................................................... 错误!未定义书签。

四、测试数据以及运行结果 (9)

五、实验感想 (13)

一、实验目的

1、掌握上下文无关文法概念。

2、掌握用动态规划算法验证某个字符串w是否属于某上下文无关文法。

二、实验内容

对于任意给定的一个上下文无关文法,并对任意字符串w, 用动态规划算法判断是否有w∈L(G)。

编写一个算法/程序,对于给定的输入,可以在多项式时间内判定ACFG。

三、实验代码

#include

// 第一类规则,即规则右边只含有两个变元

class Regular_1

{

public:

int left;

int right_1;

int right_2;

};

// 第二类规则,即规则右边只含有一个终结符或者空

class Regular_2

{

public:

int left;

int right;

};

// 表格类,用来存放中间数据

class Table

{

public:

int size; // 表格的行和列的数量,与输入长度相同

int num_v; // 表格中每个单元格最多含有的数量大小,与cfg的变元数量相同

int ***value; // 用来存放数据的三元数组

Table(int num_v,int num_w); // 构造函数,参数指定输入字符串的长度以及cfg变元的数量

~Table(); // 析构函数

void SetValue(int i,int j,int num); // 向表格第i行j列追加数据num

bool CheckValue(int i,int j,int num); // 检查表格第i行j列是否含有数据num,含有则返回true,否则返回false

void Print(); // 打印表格的内容

};

Table::~Table()

{

if(value)

delete value;

}

void Table::SetValue(int i,int j,int num)

{

int *p=value[i][j];

// 寻找追加数据的位置

while((*p)!=-1)

{

p++;

}

*p=num;

}

bool Table::CheckV alue(int i,int j,int num) {

int *p=value[i][j];

while((*p)!=-1)

{

if((*p)==num)

return true;

p++;

}

return false;

}

Table::Table(int num_v,int num_w)

{

size=num_w;

this->num_v=num_v;

value=new int**[num_w];

// 给value动态分配,并将初值设为-1

for(int i=0;i

{

value[i]=new int*[num_w];

for(int j=0;j

{

value[i][j]=new int[num_v];

for(int k=0;k

{

value[i][j][k]=-1;

}

}

}

}

void Table::Print()

{

int i,j,k;

cout<<"---------------打印表格内容------------------"<

if(size==0)

{

cout<<"表格为空"<

return;

}

cout<<"表格内容如下:"<

for(i=0;i

{

for(j=0;j

{

cout<<"table["<

for(k=0;k

{

if(this->value[i][j][k]==-1)

break;

else

cout<value[i][j][k]<<" ";

}

cout<

}

}

}

class CFG

{

public:

int num_v;

int num_e;

Regular_1* r1;

Regular_2* r2;

int start_v;

bool Go(int *w);

CFG();

相关文档
最新文档