C语言之Chomsky文法类型判断

2024-03-23 03:08

本文主要是介绍C语言之Chomsky文法类型判断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

文法G[S] = {VN,VT,P,S}:

其中VN(非终结符),VT(终结符),P(产生式集),是非空的有限集;

S属于VN,是文法的开始符号;

 

根据产生式集来判断文法的类型:

 

#include<stdio.h>
#include<string.h>#define len 3//0型文法:左侧必须含有非终结符
int zeroJudge(char part[2][10])
{int i = 0;//判断产生式左值是否全为非终结符while(part[0][i] != '\0'){/*if(part[0][i] < 65 || (part[0][i] > 90 && part[0][i] < 97) || part[0][i] > 122){printf("含有非法符号,不合法产生式!\n");return -1;}else*/ if((part[0][i] >= 97 && part[0][i] <= 122)){if(i == (strlen(part[0])-1)){printf("左侧全为终结符,不合法产生式!\n");return 0;}}else if(part[0][i] >= 65 && part[0][i] <= 90){//合法产生式break;}i++;}return 1;
}//1型文法:右侧的字符长度大于等于左侧
int oneJudge(char part[2][10])
{if(strlen(part[1]) >= strlen(part[0])){return 1;}return 0;
}//2型文法:左侧仅含一个非终结符
int twoJudge(char part[2][10])
{if((1 == strlen(part[0])) && (part[0][0] >= 65 && part[0][0] <= 90)){return 1;}return 0;
}//3型文法:产生式必须型如:A->Aa|a或A->aA|a
int threeJudge(char part[2][10])
{if((1 == strlen(part[1])) && (part[1][0] >= 97 && part[1][0] <= 122)){return 1;}if(2 == strlen(part[1])){if((part[1][0] >= 65 && part[1][0] <= 90) && (part[1][1] >= 97 && part[1][1] <= 122)){return 1;}if((part[1][0] >= 97 && part[1][0] <= 122) && (part[1][1] >= 65 && part[1][1] <= 90)){return 1;}}return 0;
}void judge(int flag)
{switch(flag){case 0:printf("0型文法!\n");break;case 1:printf("1型文法!\n");break;case 2:printf("2型文法!\n");break;case 3:printf("3型文法!\n");break;}
}int main()
{char gram[len][20];int i = 0;int j = 0;int m = 0;const char *split = "=";char *p;char part[2][10];int flag = 4;//存储文法while(i < len){scanf("%s",&gram[i]);i++;}//判断文法类型for(j = 0; j < len; j++){//根据"="分割  得到文法产生式的左右两部分p = strtok (gram[j],split);m = 0;while(p!=NULL) {strcpy(part[m],p);m++;//分割下一个产生式p = strtok(NULL,split);}if(zeroJudge(part)){if(oneJudge(part)){if(twoJudge(part)){if(threeJudge(part)){if(flag < 3);elseflag = 3;}else{if(flag < 2);elseflag = 2;}}else{if(flag < 1);elseflag = 1;}}else{flag = 0;}}}judge(flag);return 0;
}

 

这篇关于C语言之Chomsky文法类型判断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836939

相关文章

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印