2009-12-09 2 views
0

Je travaille sur un automate déterministe fini basé sur this.Marquage de l'état initial de cet automate fini

A partir de ce code:

public void markInitialState (int initialStateId) { 

        State theInitialState = allStates.get(initialStateId); 
        theInitialState.isInitial=true; 
        allStates.add(initialStateId, theInitialState); 

       /*DEBUG*/ 

       System.out.println(" THE INITIAL STATE ID IS " + initialStateId); 

       theInitialState = allStates.get(initialStateId); 
       if ((theInitialState.isInitial)==true) 
       System.out.println("THE STATE " + theInitialState + " IS MARKED AS INITIAL"); 

     } 

Je suis en train de la ligne:

THE STATE {d=(this Map), e=(this Map), a=(this Map)} IS MARKED AS INITIAL 

Sur la ligne qui devrait dire:

THE STATE 2 IS MARKED AS INITIAL 

Pourquoi la carte fait cela?

Je ne comprends pas pourquoi il est correct de marquer les états finaux en utilisant la même approche.

Le fichier d'entrée est:

4 
3 2 1 
ab 
1 0 
2 0 
2 0 
2 
0 3 
abaa 
aab 
aba 
3 3 2 
ade 
0 1 2 
1 2 0 
2 1 0 
1 2 
2 2 
a 
de 
3 2 1 
ab 
1 0 
2 0 
2 0 
2 
0 3 
abaa 
aab 
aba 
3 3 2 
ade 
0 1 2 
1 2 0 
2 1 0 
1 2 
2 2 
a 
de 

Le code:

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package afd; 

import java.io.*; 
import java.util.*; 

/** 
* 
* @author Administrator 
*/ 
public class Main { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws IOException { 
     // TODO code application logic here 

     FileReader fr = new FileReader("E://Documents and Settings//Administrator//My Documents//NetBeansProjects//AFD//src//afd//dfa.in"); 


     BufferedReader br = new BufferedReader(fr); 

     String firstLine= br.readLine(); 


     String [] firstLineSplitted = firstLine.split(" "); 

     /*debug*/ 
     System.out.println("firstLine is " + firstLine); 

     int numberOfTestCases = Integer.parseInt(firstLine); 

     for (int indexOfTestCases =0; indexOfTestCases < numberOfTestCases; indexOfTestCases++ ){ 



      String caseStartLine = br.readLine(); 

      /*debug*/ 
      System.out.println("caseStarLine is " + caseStartLine); 
      String [] caseStartLineSplitted = caseStartLine.split(" "); 

      int numberOfStates; 
      int numberOfAlphabetSymbols; 
      int numberOfFinalStates; 


      numberOfStates = Integer.parseInt(caseStartLineSplitted[0]); 

      numberOfAlphabetSymbols = Integer.parseInt(caseStartLineSplitted[1]); 

      numberOfFinalStates = Integer.parseInt(caseStartLineSplitted[2]); 




      Automaton automaton = new Automaton(); 


      automaton.setAllStates(numberOfStates); 

    //   automaton.size = numberOfStates; 
//   automaton.numberOfAlphabetSymbols = numberOfAlphabetSymbols; 
//   automaton.numberOfFinalStates = numberOfFinalStates; 
      //Automaton a = new Automaton(numberOfStates); 


      String alphabetLine = br.readLine(); 
      System.out.println("alphabetLine is " + alphabetLine); 

      automaton.setAlphabet (alphabetLine); 

//   automaton.alphabetSymbols =new StringBuffer(alphabetLine); 

      for (int indexOfStates = 0; indexOfStates < numberOfStates; indexOfStates++){ 

        String transitionsLine = br.readLine(); 
        /*debug*/ 
        System.out.println("transitionsLine is " + transitionsLine); 

        automaton.setTransitions(indexOfStates,transitionsLine); 

        /*String [] ijLineSplitted = ijLine.split(" "); 

        int i = Integer.parseInt(ijLineSplitted[0]); 
        int j = Integer.parseInt(ijLineSplitted[1]); 
        */ 

      } 

      String finalStatesLine = br.readLine(); 
      /*debug*/ 
      System.out.println("finalStatesLine is " + finalStatesLine); 
      String finalStatesLineSplitted [] = finalStatesLine.split(" "); 

      automaton.markFinalStates(finalStatesLineSplitted); 



      String initialStateAndNumberOfStringsLine = br.readLine(); 

      /*debug*/ 
      System.out.println("initialStateAndNumberOfStringsLine is " +initialStateAndNumberOfStringsLine); 
      String [] splittedInitialStateLine = initialStateAndNumberOfStringsLine.split(" "); 

      int initialState = Integer.parseInt(splittedInitialStateLine[0]); 
      int numberOfStrings = Integer.parseInt(splittedInitialStateLine[1]); 

      automaton.markInitialState(initialState); 

      for (int stringIndex =0; stringIndex<numberOfStrings; stringIndex++){ 

       String stringToProcess = br.readLine(); 
       /*debug*/ 
      System.out.println("stringToProcess is " + stringToProcess); 


      } 


     } 
     } 







} 


class State extends HashMap<Character, State>{ 

boolean isFinal; 
boolean isInitial; 

State() { 
    isInitial=false; 
    isFinal = false; 
    } 

} 

    class Automaton{ 
    List <State> allStates; 
    //private List<State> finalStates; 
    State initialState; 
    State currentState; 
     char [] alphabet; 




    Automaton() { 


     allStates = new ArrayList<State>(); 


    } 

    public void setAllStates (int numberOfStates) { 

     for (int i =0; i <numberOfStates; i++) { 

      State newState = new State(); 
      allStates.add(newState); 

     } 

    } 


    public void setAlphabet (String alphabetLine){ 

     alphabet = alphabetLine.toCharArray(); 




    } 

    public void markFinalStates (String [] finalStates){ 

     for (int index =0; index<finalStates.length; index++) { 

      int aFinalStateId = Integer.parseInt(finalStates[index]); 

      State aFinalState = allStates.get(aFinalStateId); 
      aFinalState.isFinal = true; 
      allStates.add(aFinalStateId, aFinalState); 


      /*DEBUG*/ 
      aFinalState = allStates.get(aFinalStateId); 
      if ((aFinalState.isFinal)==true) 
      System.out.println("THE STATE " + aFinalStateId + " IS MARKED AS FINAL"); 

     } 

    } 

    public void markInitialState (int initialStateId) { 

      State theInitialState = allStates.get(initialStateId); 
      theInitialState.isInitial=true; 
      allStates.add(initialStateId, theInitialState); 

      /*DEBUG*/ 

      System.out.println(" THE INITIAL STATE ID IS " + initialStateId); 

      theInitialState = allStates.get(initialStateId); 
      if ((theInitialState.isInitial)==true) 
      System.out.println("THE STATE " + theInitialState + " IS MARKED AS INITIAL"); 

    } 


    public void setTransitions(int stateId, String transitionsLine){ 


      State theOneToChange = allStates.get(stateId); 

      String [] statesToReachStringSplitted = transitionsLine.split(" "); 

      for (int symbolIndex=0; symbolIndex<statesToReachStringSplitted.length;symbolIndex++){ 

       int reachedState= Integer.parseInt(statesToReachStringSplitted[symbolIndex]); 

       theOneToChange.put(alphabet[symbolIndex],allStates.get(reachedState)); 

       System.out.println("THE STATE " + stateId + " REACHES THE STATE " + reachedState + " WITH THE SYMBOL " + alphabet[symbolIndex]); 

      } 

      allStates.add(stateId, theOneToChange); 

    } 


    public boolean processString (String string) 
    { 


     boolean accepted = false; 

     return accepted; 


    } 


} 

Répondre

0
public void markInitialState (int initialStateId) { 

     State theInitialState = allStates.get(initialStateId); 
     theInitialState.isInitial=true; 
     allStates.add(initialStateId, theInitialState); 

     /*DEBUG*/ 

     System.out.println(" THE INITIAL STATE ID IS " + initialStateId); 

     theInitialState = allStates.get(initialStateId); 
     if ((theInitialState.isInitial)==true) 
     System.out.println("THE STATE " + theInitialState + " IS MARKED AS INITIAL"); 

} 

Sur la dernière ligne de cette méthode, vous imprimez theInitialState au lieu de initialStateID.