计算机理论导引实验报告2-上下文无关文法(CFG)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HUNAN UNIVERSITY
计算理论导引实验报告
题目:上下文无关文法(CFG)学生姓名:
学生学号:
专业班级:计算机科学与技术2班
上课老师:
实验日期:2014-1-5
一、实验目的 (2)
二、实验内容.......................................................................................... 错误!未定义书签。
三、实验代码.......................................................................................... 错误!未定义书签。
四、测试数据以及运行结果 (9)
五、实验感想 (13)
一、实验目的
1、掌握上下文无关文法概念。
2、掌握用动态规划算法验证某个字符串w是否属于某上下文无关文法。
二、实验内容
对于任意给定的一个上下文无关文法,并对任意字符串w, 用动态规划算法判断是否有w∈L(G)。
编写一个算法/程序,对于给定的输入
三、实验代码
#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< } cout< } } } class CFG { public: int num_v; int num_e; Regular_1* r1; Regular_2* r2; int start_v; bool Go(int *w); CFG();