如何在不使用reg表达式的情况下在Java中实现DFA?

时间:2013-11-22 20:33:42

标签: java finite-automata state-machine dfa states

我有这个输入文件:

2
4
ab
1 0 2 0 3 0 3 3
0
1 3
aaa
bbaaab
abab
zzz
7
ab
2 1 3 0 4 3 5 2 6 5 6 4 6 6
0
1 5
a
aab
baa
bbabbabbb
ababb
ababba
zzz

第一行代表测试用例的数量。

每个测试用例以3个整数开始,第一个是自动机的状态数,接下来是字母表中符号的数量,然后是最终状态的数量。

下一行是字母表。符号一起出现。

接下来是包含Σ(字母表)输入的任意数量的行。每个输入都是取自Σ(字母)的字符串。

输入行由包含字符串zzz的最后一行终止。

我的输出应该是这样的

DMA M1
aaa: Accepted
bbaaab: Accepted
abab: Rejected

DMA M2
a: Rejected
aab: Accepted
baa: Accepted
bbabbabbb: Accepted
ababb: Accepted
ababba: Rejected

到目前为止,这是我的代码:

import java.util.Scanner;
import java.lang.String;

public class DFAImplementation {

    public static void main(String[] args) throws Exception {

        //create the file instance
        java.io.File file = new java.io.File("DFA.txt");
        //it's scanner time
        Scanner input = new Scanner(file);
        //read it
        int dfaAmount = input.nextInt();
        //loop for amount of dfas
       for (int dfaAmountIndex = 0; dfaAmountIndex < dfaAmount;
                dfaAmountIndex++){
            int numberOfStates = input.nextInt();
            int startState;
            int numberOfSigmaSym;



            String sigma = "";
            sigma = input.next();


            numberOfSigmaSym = sigma.length();
            String transitionLine = input.nextLine();
            int[][] transition = new int[numberOfStates][numberOfSigmaSym];


            startState = input.nextInt();    
            //checker
            System.out.println(startState);
            int i;
            int j;
            for (i=0; i < numberOfStates; i++){
                numberOfStates = i;
                numberOfSigmaSym = j;
                for (j=0; j < sigma.length(); j++){
            int state1 = transition[i][j];
                }
        }

            String w;
            w = input.nextLine();
            for (i=0; i < w.length(); i++){

                 char x;
               x = w.charAt(i);
               int state = startState;
                int index = sigma.indexOf(x);
                int state1 = transition [state][index];
            }
            int numberOfAcceptStates;
            numberOfAcceptStates = input.nextInt();
            int acceptState;
            acceptState = input.nextInt();





         // if(){

          }
      //    else(){
       }

    }

//}

- 编辑:基本上我只是不知道如何处理我的转换数组和状态。

1 个答案:

答案 0 :(得分:-1)

查看aaa从0开始的第一个示例将移动为; 0(a) - &gt; 1(a) - &gt; 2(a) - &gt; 3和3是有效的结束状态,类似于bbaaab; 0(b) - &gt; 0(b) - &gt; 0(a) - &gt; 1(a) - &gt; 2(a) - &gt; 3(b) - &gt; 3

因此,将状态读入具有字母表的数组或散列表以及字母所属的下一个状态的对象可能更容易。

比行中的每个字母移动到下一个状态,即;

 int currentState = 0; 
for (i=0; i<w.length();i++) 
    currentState = states[currentState].nextState(w.charAt(i)) 

州是什么样的;

State[] states;

状态是这样的;

Hashtable<Integer, Integer> nextStates;
 public int nextState(char letter) { 
    return nextStates.get(Integer.valueOf(letter));
 } 

然后检查当前状态是否为有效的结束状态。