形式语言与自动机:实验二——DFA识别句子

一、实验目的:
加深对DFA工作原理的理解。
二、实验内容:
1.设计固定DFA。也就是说用if-then-else(一般用来实现字母表中只有两个字母的情况)、switch(大于两个字母的情况)、for(用于控制输入字符串,长度为n的字符串,for循环n次)等语句表示DFA。一个函数定义一个DFA;
2.设计文件形式存储DFA。设计文件格式,DFA动态生成,使用字符串来验证DFA的有效性和正确性;(使用面向对象的方法。对于k个状态的DFA,生成相应的k个状态对象;状态转换应通过对象间的消息传递来实现)
3.图形化表示。用java或者VC中图形功能实现图形化的dfa。(选作)
三、程序代码

package xing3;

import java.io.IOException;
import java.util.Scanner;
import java.io.*;

public class Test2 {
	static String Q[]=new String[100];    //记录状态
	static char A[]=new char[100];    //记录符号字母表
	static String T[]=new String[100];   //记录状态转移函数
	static String S=null;     //记录开始符
	static String F[]=new String[100];  //记录终止状态
	static int LenGth;     //记录状态转移函数的个数
	static String Str=null;
	
	static String Start(String str,char c) {
		for(int i=0;i<LenGth;i++) {
			if(str.equals(T[i].subSequence(1, 3))==true && c==T[i].charAt(4)) {
				System.out.println(T[i]);
				return T[i].substring(7, 9);
			}
		}
		return null;
	}

	@SuppressWarnings("resource")
	public static void main(String[] args) throws IOException {
		int len_F = 0;
		Scanner in = new Scanner(System.in);
		BufferedReader filereader = new BufferedReader(new FileReader("Read2.txt"));
		int Leng = 1;
		String Temp;
		int t = 0; // 记录产生式的个数
		while ((Temp = filereader.readLine()) != null) {
			Leng++;
		}
		Leng--;

		BufferedReader filereade = new BufferedReader(new FileReader("Read2.txt"));
		int Len = 1;
		while ((Temp = filereade.readLine()) != null) {
			if (Len == 1) {
				int p = 0;
				int begin = 3;
				int end;
				for (int i = 3; i < Temp.length(); i += 2) {
					if (Temp.charAt(i) == ','||Temp.charAt(i) == '}') {
						end = i;
						Q[p++] = Temp.substring(begin, end);
						begin = i + 1;
					}
				}
			}
			if (Len == 2) {
				int p = 0;
				for (int i = 3; i < Temp.length(); i += 2) {
					A[p++] = Temp.charAt(i);
				}
			}
			if (Len > 3 && Len <= Leng - 2) {
				T[t++] = Temp;
			}
			if (Len == Leng - 1) {
				S = Temp.substring(3, 5);
			}
			if (Len == Leng) {    //终止
				int p = 0;
				int begin = 3;
				int end;
				for (int i = 3; i < Temp.length(); i += 2) {
					if (Temp.charAt(i) == ','||Temp.charAt(i) == '}') {
						end = i;
						F[p++] = Temp.substring(begin, end);
						begin = i + 1;
					}
				}
				len_F=p;
			}
			Len++;
		} // while
		System.out.println("输出状态产生式:");
		for(int i=0;i<t;i++)
			System.out.println(T[i]);
		LenGth = t;
		System.out.println("输入k个状态:");
		Str = in.next();
		String str1 = S;
		for (int i = 0; i < Str.length(); i++) {
			String str2 = Start(str1, Str.charAt(i));
			str1 = str2;
		}
		int flag=1;
		for(int i=0;i<len_F;i++) {
			if(str1.equals(F[i])) {
				System.out.println("状态可以被DFA识别!");
				flag=0;
			}
		}
		if(flag==1) {
			System.out.println("状态不可以被DFA识别!");
		}
	}
}

四、运行结果
文件:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_码到成功_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值