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

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

相关文章

利用c++判断水仙花数并输出示例代码

《利用c++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

C# WebAPI的几种返回类型方式

《C#WebAPI的几种返回类型方式》本文主要介绍了C#WebAPI的几种返回类型方式,包括直接返回指定类型、返回IActionResult实例和返回ActionResult,文中通过示例代码介绍的... 目录创建 Controller 和 Model 类在 Action 中返回 指定类型在 Action

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

Java编译错误java.lang.NoSuchFieldError的解决方案详析

《Java编译错误java.lang.NoSuchFieldError的解决方案详析》java.lang.NoSuchFieldError是Java中的一种运行时错误,:本文主要介绍Java编译错... 目录前言解决方案1. 统一JDK版本环境2. 优化maven-compiler-plugin配置3. 清