一、实验目的:
加深对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识别!");
}
}
}
四、运行结果
文件: