1实验目的
通过给定的正规文法,构造其相应的有穷自动机,M=(K,∑,f,S,Z),理解正规文法与正规式的等价性以及之间的相互转化。
2实验内容
读入正规文法文件(FilegrammarIn.java),提取 K:状态集 State.java
∑:输入符号字母表 Alphabet.java
S:初态
Z:终态
并将文法保存入StateTranfer.java.
构造有穷自动机FA,有穷自动机类包括以下两个方法
FA.java
public FA(String inputs,FilegrammarIn grammar)//构造有穷自动机,初始化类成员变量
public void FAexecute()//运行FA,并输出状态之间的转化函数
程序模块功能说明:
Main.java
引导类,调用FAexecute()
FA.java
主类模块,构造有穷自动机,提供服务FAexecute()
StateTranfer.java.
文法状态转化保存
程序调试
编译各模块,运行Main.java,注意文法文件的路径见FilegrammarIn.java
3实验结果:
***********************************
Test 2 有穷自动机的构造实验?
written by 郭振 200342000405
***********************************
Reading the File D:/UTIL.H and write into the array ST
输入文法为:
SSa
SAa
SBb
ABa
AZa
BAb
BZb
ZZa
the FA is setting up!!
[状态表]M:{SAB}
[字母表]:{a b}
[初态]S: S
[终态]S: Z
[转化函数]f:
f(S,a)=S
f(S,a)=A
f(S,b)=B
f(A,a)=B
f(A,a)=Z
f(B,b)=A
f(B,b)=Z
f(Z,a)=Z
Press any key to continue...
4实验总结
在做之前现做好设计文档,把输入输出和各模块之间的关系用流程图表示出来。调试程序时多设输出点,以便找出出错点。
Main.java
//test3:Main.java
//the class is the entrance to main function
package test3;
import java.io.*;
public class Main{
public static void main(String args[])
{
String inputs="ab";
System.out.println("***********************************");
System.out.println("Test 3 有穷自动机的确定化实验 ");
System.out.println("written by 郭振 200342000405");
System.out.println("***********************************");
FilegrammarIn grammar=new FilegrammarIn();
FA fa=new FA(inputs,grammar);
fa.FAexecute();
System.out.println("***********************************");
System.out.println("利用子集法将NFA---DFA");
System.out.println("经过确定化之后的五个状态:");
fa.FAconfirm();
System.out.println("***********************************");
}
}
FilegrammarIn.java
//test3:FilegrammarIn.java
package test2;
import java.io.*;
public class FilegrammarIn
{
public StateTranfer[] ST;
FilegrammarIn(){
System.out.println("Reading the File D://UTIL.H and write into the array ST");
String s="";
ST=new StateTranfer[7];
try
{FileReader rf=new FileReader("D://UTIL.H");
BufferedReader brf=new BufferedReader(rf);
String rs;
int i=0;
while((rs=brf.readLine())!=null)
{s=s+rs+"/n";
ST[i++]=new StateTranfer((char)rs.charAt(0),(char)rs.charAt(1),(char)rs.charAt(2));
}
brf.close();}
catch(IOException e)
{System.out.println(e);}
System.out.println(" 输入文法为: ");
System.out.println(s);
}
}
//test2:StateTranfer.java
//the class save the grammer .eg: S -aB
// Start=S Done=B media=a
package test2;
public class StateTranfer{
public String Start;
public String Done;
public String media;
public StateTranfer(char s,char d,char m)
{
Start="";
Done="";
media="";
this.Start=String.valueOf(s);
this.Done=String.valueOf(d);
this.media=String.valueOf(m);
}
}
//test2;FA.java
//the class create the FA
package test2;
import java.io.*;
import java.util.*;
public class FA{
String inputs;
int counter;
State st;
FilegrammarIn grammar;
public FA(String inputs,FilegrammarIn grammar){
this.inputs=inputs;
counter=0;
System.out.println("the FA is setting up!!");
State st=new State();
System.out.println("[状态表]M:"+"{"+st.state+"}");
Alphabet al=new Alphabet();
System.out.println("[字母表]:"+"{"+al.al+"}");
System.out.println("[初态]S: S");
System.out.println("[终态]S: Z");
System.out.println("[转化函数]f: ");
this.grammar=grammar;
}
public void FAexecute(){
String state="",media="";
char mm[]={'S','A','B','Z'};
for(int j=0;j<4;j++){
state=String.valueOf(mm[j]);
int i;
counter=0;
while(counter<inputs.length()){
media=String.valueOf((char)inputs.charAt(counter++));
for(i=0;i<7;i++){
if(grammar.ST[i].Start.equalsIgnoreCase(state)&&grammar.ST[i].media.equalsIgnoreCase(media))
System.out.println("f("+grammar.ST[i].Start+","+grammar.ST[i].media
+")="+grammar.ST[i].Done);
}
}
}
}
/*The fuction confirm FA and print the new State*/
public void FAconfirm(){
ArrayList stateList = new ArrayList();//use the ArrayList to save the new state
String currentState,current;
String state="",media="";
String resWord;
int i=0,j=1,k,c,m,flag=0;
currentState="S";
stateList.add(currentState);
while(i<5){
currentState=(String)stateList.get(i++);//remains the new state from arrayList
counter=0;//counter on inputs
media="";
current="";
while(counter<2){
media=String.valueOf((char)inputs.charAt(counter++));
state="";
for(m=0;m<currentState.length();m++){
current=String.valueOf(currentState.charAt(m));
for(k=0;k<7;k++){
if(grammar.ST[k].Start.equalsIgnoreCase(current)&&grammar.ST[k].media.equalsIgnoreCase(media))
state=state+grammar.ST[k].Done;
}
}
flag=1;
/* look the ArrayList up to locate the same state*/
for(c=0;c<stateList.size();c++){
resWord=(String)stateList.get(c);
if (!resWord.equalsIgnoreCase(state))
flag=flag*1;
else flag=flag*0;
}
if(flag==1) stateList.add(state);
}
}
for(k=0;k<stateList.size();k++)
System.out.println((String)stateList.get(k));
}
}