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

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

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。