形式語言與自動機:實驗二——DFA識別句子

XzTony_濤發表於2020-11-22

一、實驗目的:
加深對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識別!");
		}
	}
}

四、執行結果
檔案:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

相關文章