Могу ли я использовать DFA для отслеживания строк определенных языков?

Обычно 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 и т. д..

i.e

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

Верно ли мое утверждение выше?


person Muthu Ganapathy Nathan    schedule 06.10.2011    source источник


Ответы (2)


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

Верно ли мое утверждение выше?

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

        <program> ::= 'A'

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

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

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

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

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

person Stephen C    schedule 06.10.2011
comment
+1 за Однако DFA будет настолько большим, что его будет невозможно реализовать. Эта строчка развеяла мои сомнения. - person Muthu Ganapathy Nathan; 06.10.2011
comment
У меня есть еще одно сомнение. Я уже реализовал таким образом, как вы сказали, мой DFA довольно большой. И я пишу DFA для распознавания ключевых слов. могу ли я объединить его в один DFA (состояния будут уменьшены) или я могу написать для этого отдельный DFA (требуется больше состояний). Что я должен увидеть? no.of.states или удобочитаемость? – - person Muthu Ganapathy Nathan; 06.10.2011

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

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

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

person Community    schedule 06.10.2011
comment
я сделал для всех комментариев, строк, символов, документации с 11 состояниями. Но я предоставил образец bcz, чтобы быть точным. И распознают ли они /**Документацию*/ с помощью CFG или описанным выше способом. - person Muthu Ganapathy Nathan; 06.10.2011