编译原理)判断文法的类型

2024-03-19 00:50

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

实验内容

从文件中读取数据,判断其为0型文法、1型文法、2型文法还是3型文法,并指出其非终结集符、终结符集和开始符号。
在这里插入图片描述

java实现

package com.wang;import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test {public static void main(String[] args) {BufferedReader br = null;try{br = new BufferedReader(new FileReader("D://大三下//编译原理//实验一//a.txt"));//根据路径获取文本StringBuffer sb = new StringBuffer();String str = null;while((str = br.readLine()) != null) {//读入文本行及其内容sb.append(str+"\n");//添加字符串到缓冲字符串流sb中}String str1 = "::=";Pattern pattern = Pattern.compile(str1);//str1为用于匹配的字符串Matcher matcher = pattern.matcher(sb);//将整个区域与模式匹配。匹配成功返回trueint num = 0;while(matcher.find()) {num++;}//统计匹配的个数System.out.println("(1)有 " + num+"个表达式");System.out.println("(2)判断文法类型:");Pattern p0=Pattern.compile("::=|\n");String[] st=p0.split(sb);int a=0,b=1;while(a<=st.length){while(b<=st.length){	if(st[a].length()==1&&st[b].length()==2){char[] c=st[b].toCharArray();String st0=String.valueOf(c[1]);char[] c0=st0.toCharArray();for(int q=0;q<c0.length;q++){if(c0[q]>='A'&&c0[q]<='Z'){System.out.println("\t"+st[a]+"::="+st[b]+" 为3型文法");}else{System.out.println("\t"+st[a]+"::="+st[b]+" 为0型文法");}}break;}if(st[a].length()==1&&st[b].length()==1){System.out.println("\t"+st[a]+"::="+st[b]+" 为3型文法");break;}if(st[a].length()==1&&st[a].length()<=st[b].length()){System.out.println("\t"+st[a]+"::="+st[b]+" 为2型文法");break;}if(st[a].length()>=1&&st[a].length()<=st[b].length()){System.out.println("\t"+st[a]+"::="+st[b]+" 为1型文法");break;}}a+=2;b+=2;}char[] array=new char[500];       //定义最大的数组用来存放文件中的字符int i=0,t,n,k;FileReader file=new FileReader(new File("D://大三下//编译原理//实验一//a.txt"));while((t=file.read())!=-1){array[i]=(char)t;i++;	}n=i;boolean frag;int count1=0;System.out.print("(3)文法的非终结符集:");for(i=0;i<n-1;i++){frag=true;for(k=0;k<i;k++){if(array[k]==array[i]){frag=false;break;}}if(array[k]<='Z'&&array[k]>='A'&&frag){count1++;System.out.print(array[k]+" ");}}System.out.print(",共"+count1+"个");System.out.println();int count2=0;System.out.print("(4)文法的终结符集:");for(i=0;i<n-1;i++){frag=true;for(k=0;k<i;k++){if(array[k]==array[i]){frag=false;break;}}if(array[k]<='z'&&array[k]>='a'&&frag){count2++;System.out.print(array[k]+" ");}}System.out.print(",共"+count2+"个");System.out.println();System.out.print("(5)文法的开始符号:");Pattern p=Pattern.compile("::=");String[] s=p.split(sb);System.out.println(s[0]);} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {if(null != br) {//关闭资源br.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}	
}

实验结果

在这里插入图片描述

这篇关于编译原理)判断文法的类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N