Chomsky文法

news2024/11/26 16:33:16

一、实验原理

了解0123型文法的定义并会判断各个文法,会编写并利用程序进行0123型文法的判断

二、实验目的

由于不同文法的判断归根结底是对产生式中不同终结符和非终结符个数的判断,所以在程序中先放置三个字符串集合用以存储终结符、非终结符、产生式,然后利用正则表达式进行产生式左右部的比对与判断

三、实验内容

1.自由输入一种文法进行待判断;
2.通过键盘输入的文法程序进行自我判断,之后将判断好的结果在控制台进行展示;

四、实验步骤

//chomsky文法判断
//0型文法  : 只需要判断左侧非空
//1型文法  :|a| < |b| 左侧长度小于右侧长度
//2型文法  : 左边必须是一个非终结符
//3型文法  : A→aB
//           A→a

//注:层层递进

#include<iostream>
#include<vector>    //vector容器
#include<string>
#include<string.h>  //memset()函数,进行清理工作
#include<cstdio>    
#include<cctype>   //用于测试和映射字符


using namespace std;
const int SIZE = 300;

class Principle
{
    public:
        string left;        //表达式左侧
        string right;       //表达式右侧
        Principle(const char *,const char *);   //构造函数
        ~Principle();                           //析构函数
};


//const修饰函数参数:对于函数的入参,
//不管是什么数据类型,也不管是 指针传递,
//还是 引用传递,只要加了 const 修饰,就可以防止函数内意外修改该参数,起到保护作用。
Principle::Principle(const char *l,const char *r)
{
    left = l;
    right = r;
}

Principle::~Principle()
{
}

//仅考虑所有元素仅有一个字符的情况
vector<char> VN;    //非终结符
vector<char> VT;    //终结符
vector<Principle> principle;    //产生式的集合
int type[SIZE]; //每个字符的类型

void input();   //输入数据
void judge();   //判断文法
void init();    //清理工作/初始化
int get_type(char); //1是非终结符,2是终结符
bool set_type(char,int);    //设置一个字符的类型
int get_result();//获取输入文法的类型


int main()
{   
    while (true)
    {
        input();
        judge();
    }
    


    getchar();
    getchar();
    return 0;
}

//输入函数
void input()
{
    char buffer[1000];
    char ** elements;
    cout<<"输入VN:"<<endl;
    cin>>buffer;
    for (int i = 0; i < strlen(buffer); i++)
    {
        char ch = buffer[i];
        if (! isupper(ch))     continue;    //判断大写字母
        if (get_type(ch))   continue;
        VN.push_back(ch);
        set_type(ch,1);
    }
    cout<<"输入VT:"<<endl;
    cin>>buffer;
    for (int i = 0; i < strlen(buffer); i++)
    {
        char ch = buffer[i];
        if (! islower(ch))     continue;    //判断小写字母
        if (get_type(ch))   continue;
        VT.push_back(ch);
        set_type(ch,2);
    }
    cout<<"输入产生式:(格式为[A::=...a..]),输入exit作为结束"<<endl;
    while (true)
    {
        cin>>buffer;
        if (! strcmp(buffer,"exit"))
        {
            break;
        }
        int i;
        for (i = 0; i < strlen(buffer); i++)
        {
            if (buffer[i] == ':')
            {
                buffer[i] = 0;
                i = i+3;
                break;
            }
        }
        principle.push_back(Principle(buffer,buffer+i));
        cout<<buffer<<buffer+i<<endl;
    }
}

void judge()
{
    int flag = get_result();
    switch (flag)
    {
    case -1:
        cout<<"产生式中出现未知字符"<<endl;
        break;
    case 0:
        cout<<"该文法为0型文法"<<endl;
        break;
    case 1:
        cout<<"该文法为1型文法"<<endl;
        break;
    case 2:
        cout<<"该文法为2型文法"<<endl;
        break;
    case 3:
        cout<<"该文法为左线性型文法"<<endl;
        break;
    case 4:
        cout<<"该文法为右线性型文法"<<endl;
        break;
    
    }
}

void init()
{
    VN.clear();
    VT.clear();
    principle.clear();
    memset(type,0,sizeof(type));
}

bool set_type(char ch,int x)
{
    type[ch] = x;
    return true;
}

int get_type(char ch)
{
    return type[ch];
}

//判断字符串是否包含未知字符
bool hasError(const string &s)
{
    for (int i = 0; i < s.length(); i++)
    {
        if (! get_type(s[i]))
        {
            return true;
        }
        
    }
    return false;
    
}

//判断是否为0型文法
bool isZero()
{
    for (int i = 0; i < principle.size(); i++)
    {
        if(hasError(principle[i].left) || hasError(principle[i].right)) return false;
    }
    return true;
    
}

//判断是否为1型文法
bool isOne()
{
    for (int i = 0; i <  principle.size(); i++)
    {
        if (principle[i].left.size() > principle[i].right.size() )
        {
            return false;
        }
        
    }
    return true;
    
}

//判断是否为2型文法
bool isTwo()
{
     for ( int i = 0 ; i < principle.size() ; i++ )
    {
        string left = principle[i].left;
        if ( left.size() != 1 ) return false;
        if ( get_type(left[0]) != 1 ) return false;
    }
    return true;
}

//判断一个2型文法是否为左线性文法
bool isLeftThree ()
{
    for ( int i = 0 ; i < principle.size() ; i++ )
    {
        string right = principle[i].right;
        for ( int j = 1; j < right.length() ; j++ )
            if ( get_type(right[j]) != 2 ) return false; 
    }
    return true;
}

//判断一个2型文法是否为右线性文法
bool isRightThree ()
{
    for ( int i = 0 ; i < principle.size() ; i++ )
    {
        string right = principle[i].right;
        for ( int j = 0 ; j < right.length()-1; j++ )
            if ( get_type(right[j]) != 2 ) 
                return false; 
    }
    return true;
}

int get_result ( )
{
    if ( !isZero() ) return -1;
    if ( !isOne() ) return 0;
    if ( !isTwo() ) return 1;
    if ( isLeftThree() ) return 3;
    if ( isRightThree() ) return 4;
    return 2;
}

五、实验数据及结果分析

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git clone info/refs not valid: is this a git repository问题解决

项目场景&#xff1a; 在我们使用gitlab克隆代码时候&#xff0c;发现无法克隆&#xff0c;遇到如下问题 $ git clone http://192.168.2.x/product/demo.git Cloning into zhlx-web-bpmn... fatal: http://192.168.2.x/product/demo.git/info/refs not valid: is this a gi…

几张图片生成3D模型?距离真正的AI建模还有多远?

时间溯回&#xff0c;早在2017年&#xff0c;美图秀秀就曾引入人工智能美化人像而被谷歌誉为“最佳娱乐App”。智能技术奔腾发展&#xff0c;今年的AIGC技术可谓在各行各业大放异彩&#xff0c;从AI绘画、AI写作到AI配音&#xff0c;人工智能技术自动生成内容已经成为继UGC、PG…

Go C编程 第1课 神奇的魔笔

慧通教育 慧通教育 1.画长方形&#xff08;GoC测试题样例&#xff09; 难度&#xff1a;1 登录 26.画7字(魔法学院第3课) 难度&#xff1a;1 登录 27.画2字(魔法学院第3课) 难度&#xff1a;1 登录 28.画十字(魔法学院第3课) 难度&#xff1a;1 登录 29.画旗帜(魔法学院第…

linux系统使用rsync做主备服务器文件同步

根据本文档设置&#xff0c;可以实现备机自动同步主机中的文件。 &#xff08;注意&#xff0c;此方式缺陷为&#xff1a;如果主机文件修改&#xff0c;但是文件大小无变化或者文件变小时&#xff0c;无法自动同步到备机中&#xff0c;只有主机中文件修改后变大或者名称修改才能…

DP学生最喜欢/讨厌选学的IB课程是什么?

我们看看IBDP在读生们对于IBDP各学科的主观看法供正在选课的准IB学生们参考&#xff01;&#xff08;以下以第一人称方式&#xff0c;信息汇总于IB论坛&#xff0c;仅汇总部分科目&#xff0c;主观性强&#xff0c;仅供参考&#xff09;DP学生最喜欢的IB课程 ● 数学 AA HL 被数…

Java基于springboot+vue+elementUI企业制度管理系统

本企业制度管理系统是针对目前企业制度管理的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的企业制度管理系统存在的问题进行分析&#xff0c;完善用户的使用体会。采用计算机系统来管理信息&#xff0c;取代人工管理模式&#xff0c;查询便利&#xff0c;信息准确率…

如何从音频中提取伴奏?这篇文章告诉你如何提取伴奏

有没有小伙伴在制作视频后期的时候为配乐而烦恼过呢&#xff1f;我就有&#xff0c;之前想为一个视频配上音乐&#xff0c;就直接将歌曲导入视频里面&#xff0c;但出来的效果很是杂乱&#xff0c;导致视频的声音听起来非常嘈杂&#xff0c;影响到了听感和观感&#xff0c;但是…

.NET MAUI Community Toolkit 中的新增功能

对于 .NET MAUI Community Toolkit 来说&#xff0c;11月是一个繁忙的时期&#xff0c;它发布了多个版本&#xff0c;其中包含大量令人惊叹的新功能。最新版本具有新的视图、布局、Tizen 支持、.NET 7 支持等等。这篇文章带你快速了解所有新功能。 什么是 .NET Community Toolk…

Spring Security学习笔记

目录 1、简介 2、初步使用 3、简单实现自定义登录页面用户名和密码 1、简介 Spring Security是一个安全管理框架&#xff0c;主要功能是认证和授权&#xff0c;大中型项目用的比较多&#xff0c;小项目Shiro用的比较多&#xff0c;但是Spring Security比Shiro功能更强大&am…

Appium基础 — APPium基础操作API

目录 1、前置代码 2、安装和卸载APP 3、判断APP是否已安装 4、关闭app软件和关闭驱动对象 5、发送文件到手机和获取手机中的文件 6、获取当前屏幕内元素结构&#xff08;重点&#xff09; 7、脚本内启动其他app 8、将应用程序置于后台运行&#xff08;重点&#xff09;…

小雉系统4.0

项目地址 官网 飞天雉&&小雉视频系统 github https://github.com/feitianzhi/xiaozhios gitee xiaozhios: “小雉系统”并非是开发操作系统,而是一套服务于软件供应商的产品升级方案; QQ交流群&#xff1a;869598376 小雉系统简介 “小雉系统”并非是开发操作系统,而…

SpringCloud项目实例--服务通讯基础API方法

Spring Cloud Alibaba提供的组件如下&#xff1a; Sentinel&#xff1a;阿里巴巴开源产品&#xff0c;不仅仅可以作为断路器&#xff0c;也支持流量控制和服务降级。 Nacos&#xff1a;阿里巴巴开源产品&#xff0c;服务注册与服务发现&#xff0c;同时也可以作为配置中心。 R…

21 【styled-components的使用】

21 【styled-components的使用】 1.为什么要用这个 我们都知道&#xff0c;我们从最开始学css的时候&#xff0c;为了避免写的样式影响到另外的地方。所以我们这样来写的。 #userConten .userBtn button{font-size: 18px; }首先给一个元素写了一个唯一id | class&#xff0c…

自动化测试流程:Python编写执行测试用例及定时自动发送最新测试报告邮件(最完整的)

今天笔者就要归纳总结下一整套测试流程&#xff0c;从无到有&#xff0c;实现零突破&#xff0c;包括如何编写测试用例&#xff0c;定时执行测试用例&#xff0c;查找最新生成的测试报告文件&#xff0c;自动发送最新测试报告邮件&#xff0c;一整套完整的测试流程。以后各位只…

Spring Boot使用EasyExcel导入导出Excel

一、导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version></dependency> 二、实现导出excel操作 1、对我们需要导出的实体类上加上注解&#xff0c;如下&#…

(二)字符函数和字符串函数详细讲解和模拟实现(优化)

✨✨✨✨✨✨✨✨✨&#x1f4d7;字符串查找函数&#xff1a;1.strstr函数2.strtok函数&#x1f4d4;错误信息报告函数&#xff1a;1.strerror函数&#x1f4d3;内存操作函数1.memcpy函数2.memmove函数3.memset函数4.memcmp函数❤️字符函数讲解&#x1f4d2;字符分类函数&…

Spring Cloud Alibaba整合Sentinel,使用nacos持久化流控规则

一、引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifac…

小程序开发有什么快捷、低成本的方法?

2022年1月17日&#xff0c;阿拉丁研究院在《2021 年度小程序互联网发展白皮书》中提到&#xff0c;微信小程序开发者突破 300 万&#xff0c;DAU 超过 4.5 亿&#xff0c;正成为人们生活的 “标配”。 作为用户&#xff0c;我们几乎时时刻刻都享受着互联网带来的便利&#xff…

JMeter5.5入门到实战:HTTP+TCP+响应断言+自定义拓展+返回值获取

前言 众所周知JMeter是业内公认的性能测试工具&#xff0c;功能十分强大且易于拓展&#xff0c;但是入门有一定门槛&#xff0c;需要明白一些基本概念。本文使用了HTTP取样器、TCP取样器、响应断言、JSON提取器等组件&#xff0c;对公司现存的登录流程进行了测试。公司的产品包…

Java中hashmap底层Hash冲突是什么?以及如何解决Hash冲突 【杭州多测师_王sir】【杭州多测师】...

一、hashMap的底层实现hashmap的底层结构在jdk1.7之前是数组链表&#xff0c;但是在jdk1.8以后&#xff0c;其变成了数组链表红黑树&#xff0c;这个操作会加快在链表时候的查询速度。当链表的长度大于8 的时候&#xff0c;链表就会变为红黑树&#xff0c;而当长度小于6的时候&…