Могу ли я использовать DFA для отслеживания строк определенных языков? - PullRequest
0 голосов
/ 06 октября 2011

Обычно DFA используются для проверки наличия данной строки на определенном языке. например, _ab1c присутствует в языке переменных в C.

Что я делаю? Но, как указано в в этом вопросе , я использую DFA для отслеживания всех комментариев, строк и т. Д.

Как у меня дела? Рассмотрим пример трассировки // комментариев в заданной строке / программе.

static int makeTransition[][] = {
        /*     Transition Table        */
              /*{other,\n, \, /, *, ', "}  */  
            /*q0*/ { 0, 0, 0, 1, 0, 0, 0},
            /*q1*/ { 0, 0,-1, 2, 0, 0, 0},
            /*q2*/ { 2, 0, 2, 2, 2, 2, 2},
        };

Для этого, если у меня есть,

void assignPointerValuesInPairs(int index) 
    {
/*comments is an ArrayList
before marking start hotpointer = -1
after marking start hotpointer = 0
after marking end hotpointer is resetted to -1*/
        switch(currentState)
            {   
            case 2:     /*q2*/
                      comments.add(/*mark start*/);
                      hotPointer = 0;
                      break;
            case 0:    /*On initial state q0*/
                switch(hotPointer)
                {
                case 0: //If I am in end of comment.
                    comments.add(/*mark end*/);                            
                     hotPointer = -1; //Resetting the hotPointer.
                             break;

                case -1: /*Already in q1 only*/
                    /*Do nothing*/
                }
        }
     }

 public static void traceOut(String s) //entire program is accepted as string.
    {
            int index = 0;
        while (index < s.length() ) {                
                      char c = s.charAt(index);
                      try{
             currentState = makeTransition[currentState][symbolToInteger(c)];
              if(currentState == -1)
              throw new InvalidSyntaxException();
                  }
              catch(InvalidSyntaxException e){
              currentState = 0;
              invalidSyntax.add(index);                      
              }
                assignPointerValuesInPairs(index);
                index++;    
            }



                currentState = 0;
                assignPointerValuesInPairs(index);  //These 2 statements help to color while typing.. (i.e) It forces the current state to get finished abruptly.   
      }

}

Мой вопрос ...

могу ли я использовать DFA, чтобы пометить конец и начало // комментария таким образом, или я должен следовать как-то иначе, например, CFG и т. д.

1021 * то есть *

Мое заявление: я могу использовать DFA не только для проверки определенного языка, но и для проследить определенные строки принадлежат определенным языкам в данном строка. (доказательство: вышеуказанным методом).

Правильно ли мое утверждение выше?

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Мое заявление: я могу использовать DFA не только для проверки определенного языка, но и для отслеживания определенных строк, принадлежащих определенным языкам в данной строке.

Правильно ли мое утверждение выше?

Ваше утверждение тривиально правильно. Определенные языки можно проверить с помощью DFA. (Доказательством является существование. Если любой такой язык существует, то ваше утверждение верно. И язык

        <program> ::= 'A'

является тривиальным примером для доказательства существования.)

Но это не особенно полезное утверждение, потому что оно ничего не говорит о том, какие разновидности языков можно проверить с помощью DFA.

Например, если ваш язык комментариев поддерживает вложение блоков комментариев (как это делали некоторые исторические языки программирования), DFA не будет работать.

Второй момент, который игнорируется в вашем утверждении, заключается в том, является ли использование DFA практическим для данного языка. Для языка с ограничениями на все формы вложенности / рекурсии в грамматике и т. Д. Вы можете теоретически перевести грамматику в один конечный DFA. Однако DFA будет настолько большим, что будет невыполнимым.

(Кроме того, ни у одного современного языка программирования нет таких границ на грамматическом уровне ... не то чтобы этот вопрос касался исключительно программирования языков.)

0 голосов
/ 06 октября 2011

Вам нужно больше состояний. Ваш DFA разбивается на многострочные комментарии. Я уверен, что вы не распознаете последовательность «конец комментария» */.

И да, DFA может распознавать комментарии такого типа. Без труда.

Большинство распространенных языков программирования не являются обычными языками и не могут быть распознаны DFA. Однако некоторые есть и могут быть.

...