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

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

【基本要求】

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;

}

时间: 2024-10-04 21:22:02

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

上下文无关文法

1.上下文无关文法定义 文法:它描述语言语法结构的一组形式规则.  上下文无关文法:它定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境.例如,在程序设计语言中,当碰到一个算术表达式时,我们完全可以"就事论事"处理,而不必考虑它所处的上下文.然而,在自然语言中,随便一个词,甚至一个字的意思在不同的上下文中都有可能有不同的意思.幸运的是,当今的程序设计语言都是上下文无关的 . 好像有点抽象,来个例子 "→"表示箭头左边的由箭头右边的定义 把He gave

句法模式识别(二)-正规文法、上下文无关文法

正规文法的特性 1.所有长度有限的语言都是正规的. 2.用正规文法当然能产生无限长串,其中周期重复部分的长度不大于非终止符的长度. 举个例子 在此规则之下,能生成句子 其中周期重复部分为ab,这个例子的非终止符的元素个数为2,故满足2不大于2. 自嵌入特性 我们把上下文无关文法中的正规文法去掉,剩下的那部分我们叫做真正的上下文无关文法. 自嵌入特性是区分真正的上下文无关文法与正规文法的判定标准. 即一个真正的上下文无关文法一定具有自嵌入特性,正规文法具有非自嵌入特性.亦即非自嵌入的上下文无关文法

基于上下文无关文法的句子生成算法

前言 算法来自国外大牛的一篇博客:点击此处可查看 算法不涉及任何人工智能领域知识,仅仅是针对上下文无关文法提出的生成句子的思路. 上下文无关文法 上下文无关文法仅与句子结构有关,与上下文语意无关. 属性|单词 --|-- S |NP VP NP |Det N / Det N NP |I / he / she / Joe VP |V NP / VP Det |a / the / my / his N |elephant / cat / jeans / suit V |kicked / follow

上下文有关文法

上下文有关文法(CSG,英语:context-sensitive grammar)是一种形式文法,其中任何产生式规则的左手端和右手端都可以被终结符和非终结符构成的上下文所围绕.上下文有关文法比上下文无关文法更一般性,但仍足够有秩序得可以被线性有界自动机所解析. 上下文有关文法的概念是诺姆·乔姆斯基在1950年代介入的,被作为描述自然语言的语法的一种方式,在自然语言中一个单词是否可以出现在特定位置上,要依赖于上下文.可以被上下文有关文法描述的形式语言叫做上下文有关语言. 形式定义 形式文法 G =

如何设计与数据上下文无关的接口测试用例

我们在做接口测试的时候很可能设计出这样与数据关联的测试用例.比如 def test_create_user(self): user = create_user(name="fred", age=29) # 调用创建用户的接口 self.assertEqual(user['name'], 'fred') def test_get_user(self): user = get_last_created_user() #调用获取最新注册用户的接口 self.assertEqual(user[

四种类型的文法总结

这是有关编译原理的. 乔姆斯基体系是计算机科学中刻画形式文法表达能力的一个分类谱系,是由诺姆·乔姆斯基于1956年提出的.它包括四个层次: 0-型文法(无限制文法或短语结构文法)包括所有的文法.该类型的文法能够产生所有可被图灵机识别的语言.可被图灵机识别的语言是指能够使图灵机停机的字串,这类语言又被称为递归可枚举语言.注意递归可枚举语言与递归语言的区别,后者是前者的一个真子集,是能够被一个总停机的图灵机判定的语言. 1-型文法(上下文相关文法)生成上下文相关语言.这种文法的产生式规则取如 αAβ

编译原理之形式语言文法分类

高级程序设计语言的三个基本因素: 语法:描述语言成分的构成规则(包括词法规则和语法规则) 语义:描述语法成分的含义 语用:描述语法成分的使用方法 形式语言理论(formal language theory)是用数学方法研究自然语言(如英语)和人工语言(如程序设计语言)的产生方式.一般性质和规则的理论.形式语言是模拟这些语言的一类数学语言,它采用数学符号,按照严格的语法规则构成.从广义上说,形式语言是符号取自某个字母表的字符串的集合.如同自然语言具有语法规则一样,形式语言也是由形式文法生成的.一个

文法分析相关笔记

描述语言语法结构的形式规则称为文法.文法是一个四元组,具体组成如图所示. 文法一共四类,若文法G=(Vn,Vt,P,S)的每个产生式α→β,均有α∈(Vn∪Vt)*,则称G为0型文法.在0型文法上加以扩展,则得到以下文法: 1型文法:G的任何产生式α→β(S→ε除外)均满足左部中文法符号的个数小于右部文法的符号的个数,又称为上下文有关文法,意味着对非终结符的替换考虑必须考虑上下文(eg:有生产式如:αAB→Βcb,假设该生产式符合1型文法的生产式,则非终结符A只有在左边为α右边为B的情况才能转化

1型,2型,3型,文法的区别

1型文法:又称为上下文有关文法, (1):式子左边可以有多个字符,但必须有一个终结符(2):式子右边可以有多个字符,可以是终结符,也可以是非终结符,但必须是有限个字符2型文法:又称为上下文无关文法,(1):式子左边只能有一个字符,而且必须是非终结符(2):式子右边可以有多个字符,可以是终结符,也可以是非终结符,8但必须是有限个字符3型文法:又称为正规文法(正规文法又包括左线性文法和右线性文法)(1):式子左边只能有一个字符,而且必须是非终结符(2):式子右边最多有二个字符,而且如果有二个字符必须