有穷自动机的构造实验


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));
                         }         
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值