Как реализовать DFA, который распознает комментарии?

Мне понадобится помощь с Java здесь... Мне нужно реализовать DFA на Java, который распознает комментарии Java, содержащиеся между /* и */. Чтобы начать с простых вещей, предположим, что алфавит DFA: {'/', '*', 'a'}, поэтому он распознает только эти 3 элемента. Возможные принятые строки:

1) /**/

2) /****/ 3) /*a*a**/ 4) /*a**/

Он не примет:

1) /*/

2) /**/***/

Для этого я разработал этот метод:

    public static boolean scan(String s){
    int i = 0, state = 0;
    while(i < s.length() && stato >= 0){
        final char ch = s.charAt(i++);
        switch(state){
            case 0:
                if(ch == '/')
                    state = 1;
                else 
                    state = -1;
                break;
            case 1: 
                if(ch == '*')
                    state = 2;
                else 
                    state = -1;
                break;
            case 2: 
                if(ch == 'a')
                    state = 2;
                else if(ch == '/')
                    state = 3;
                else 
                    state = -1;
                break;
            case 3: 
                if(ch == '*')
                    state = 4;
                else 
                    state = -1;
                break;
            case 4:
                if(ch == ' ')
                    state = 4;
                else
                    state = -1;
                break;
        }
    }
    System.out.println("State: " + state);
    return state == 4;
}

Но при простейшем вводе /**/ status переменная равна -1, хотя должно быть 4. Какие изменения мне следует внести? Надеюсь, вы, ребята, можете мне помочь... Спасибо.


person Sergio    schedule 01.08.2018    source источник


Ответы (1)


На шаге 3 ваше состояние стало -1. то как вы получите соответствие. Смотрите этот блок:

case 2: 
            if(ch == 'a')
                state = 2;
            else if(ch == '/')
                state = 3;
            else 
                state = -1;
            break;
  1. State 0 : char / : nextState 1
  2. State 1 : char * : nextState 2
  3. State 2 : char * : nextState -1
  4. State -1 : char / : nextState -1
person GolamMazid Sajib    schedule 01.08.2018