形式语言与自动机:实验二——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识别!");
		}
	}
}

四、运行结果
文件:
形式语言与自动机:实验二——DFA识别句子
形式语言与自动机:实验二——DFA识别句子
形式语言与自动机:实验二——DFA识别句子

上一篇:柔性多模正则匹配引擎


下一篇:2020编译原理练习记录------40分大题揭幕(3)