上下文无关文法的表示与存储

【问题描述】把输入的文法存储在计算机内。

【基本要求】

1、输入上下文无关文法的一组产生式。

2、将文法按顺序或链式结构存储在计算机内。

3、输出文法的四要素:终极符集合、非终极符集合、规则式集合和开始符。

4、开始符在输入时指明,否则将所输入第一条规则式的左部符号视为开始符。

例如输入如下文法:

E->E+T| T 

T- >T*F| F 

F->(E)|i

下面是C++代码:

#include<iostream>

using namespace std;

 

const int MaxRightLenth=20;

const int MaxRuleNum=20;

const int MaxVtNum=20;

const int MaxVnNum=20;

 

struct rule 

{

char Left;

char Right[MaxRightLenth];

int RLength;

} ;//声明结构体类型

 

char Vt[MaxVtNum]; //定义终极符号集

char Vn[MaxVnNum]; //定义非终极符号集

 

int  main()

{

int n;//文法表达式数目

int x=0;//非终极符号集元素个数

int y=0;//终极符号集元素个数

cout<<"请输入表达式数目n:";

cin>>n;

struct rule grammar[MaxRuleNum]; //定义文法

cout<<endl;

char xy[2];

 

//输入文法

for(int i=0;i<n;i++)

{

cout<<"请输入第"<<i<<"个文法右部长度:";

cin>>grammar[i].RLength;

cout<<"请输入第"<<i<<"个文法"<<endl;

 

cin>>grammar[i].Left;

 

for(int x=0;x<2;x++) 

{

cin>>xy[x];

}

//cout<<"请输入第"<<i<<"个文法右部:";

for(int j=0;j<grammar[i].RLength;j++) //输入文法右部

{

cin>>grammar[i].Right[j];

}

cout<<endl;

for(x=0;x<2;x++) 

{

xy[x]='\0';

}

}

 

//存储文法

for(i=0;i<n;i++)

{

if(grammar[i].Left>='A'&&grammar[i].Left<='Z')

{

Vn[x] = grammar[i].Left;

x++;

}

for(int j=0;j<grammar[i].RLength;j++) 

{

if(grammar[i].Right[j]>='A'&&grammar[i].Right[j]<='Z')

{

Vn[x] = grammar[i].Right[j];

x++;

}

else if(grammar[i].Right[j]!='|'&&grammar[i].Right[j]!='&')

{

Vt[y] = grammar[i].Right[j];

y++;

}

}

}

 

//去重复字符串

for(i=0;i<x;i++)

{

for(int j=i+1;j<x;j++)

{

if(Vn[i]==Vn[j])

{

Vn[j]='\0';

}

}

}

 

for(i=0;i<y;i++)

{

for(int j=i+1;j<y;j++)

{

if(Vt[i]==Vn[j])

{

Vt[j]='\0';

}

}

}

 

cout<<"开始符:"<<grammar[0].Left<<endl;

cout<<"非终结符集:";

for(i=0;i<x;i++)

{

 

if(Vn[i]=='\0')

{

continue;

}

cout<<Vn[i];

cout<<" ";

}

cout<<endl;

 

cout<<"终结符集: ";

for(i=0;i<y;i++)

{

cout<<Vt[i]<<" ";

}

cout<<endl;

return 0;

}

转载于:https://www.cnblogs.com/litianqun/p/4705738.html

实验2 文法的读入、判定和处理 一、实验目的 熟悉文法的结构,了解文法计算机内的表示方法。 二、实验内容 1、 设计一个表示文法的数据结构; 2、 从文本文件读入文法,利用定义的数据结构存放文法,并输出; 3、 本实验结果将来还有用。 三、实验要求 1、 了解文法定义的4个部分: G(Vn, Vt, S, P) Vn 文法的非终结符号集合,在实验用大写的英文字母表示; Vt 文法的终结符号集合,在实验用小写的英文字母表示; S 开始符号,在实验是Vn集合的一个元素; P 产生式,分左部和右部,左部为非终结符号的一个,右部为终结符号或非终结符号组成的字符串,如S->ab|c 2、 根据文法各个部分的性质,设计一个合理的数据结构用来表示文法, 1) 若使用C语言编写,则文法可以设计成结构体形式,结构体应包含上述的4部分, 2) 若使用C++语言或java语言编写,则文法可以设计成文法类形式,类至少含有4个数据成员,分别表示上述4个部分 文法数据结构的具体设计由学生根据自己想法完成,并使用C或C++语言或Java实现设计的数据结构。 3、 利用完成的数据结构完成以下功能: 1) 从文本文件读入文法文法事先应写入文本文件); 2) 根据文法产生式的结构,分析出文法的4个部分,分别写入定义好的文法数据结构的相应部分; 3) 整理文法的结构,判断该文法文法类型,是否为0型,1型,2型或3型文法,并输出判断结果; 4) 在计算机屏幕或者文本框输出文法文法输出按照一个非终结符号一行,开始符号引出的产生式写在第一行,同一个非终结符号的候选式用“|”分隔的方式输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值