0

通常、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などの他の方法に従う必要があります。

すなわち

私の声明:DFAを使用して、特定の言語をチェックするだけでなく、特定の文字列内の特定の言語に属する特定の文字列を追跡することもできます。(証明:上記の方法による)。

上記のステートメントは正しいですか?

4

2 に答える 2

1

私の声明:DFAを使用して、特定の言語をチェックするだけでなく、特定の文字列内の特定の言語に属する特定の文字列を追跡することもできます。

上記のステートメントは正しいですか?

あなたの発言は自明に正しいです。 特定の言語はDFAを使用して確認できます。(証拠は存在によるものです。そのような言語が存在する場合、あなたの声明は真実です。そしてその言語

        <program> ::= 'A'

存在証明を満たすための簡単な例です。)

ただし、DFAを使用してチェックできる言語の種類については何も述べられていないため、これは特に有用なステートメントではありません。

たとえば、コメント言語がコメントブロックのネストをサポートしている場合(一部の歴史的なプログラミング言語がサポートしているように)、DFAは機能しません。

あなたのステートメントが無視する2番目のポイントは、DFAの使用が特定の言語で実用的かどうかです。文法などのすべての形式のネスト/再帰に境界がある言語の場合、理論的には、文法を単一の有限DFAに変換できます。ただし、DFAは非常に大きいため、実装できません。

(余談ですが、現代のプログラミング言語には文法レベルでそのような境界がありません...この質問がプログラミング言語だけに関するものではありません。)

于 2011-10-06T02:25:28.790 に答える
0

より多くの州が必要です。あなたのDFAは複数行のコメントで壊れます。の「コメントの終わり」シーケンスを認識していないことは間違いありません*/

そして、はい、DFAはこれらのタイプのコメントを認識できます。簡単に。

最も一般的なプログラミング言語は正規言語ではなく、DFAでは認識できません。ただし、一部はそうであり、可能性があります。

于 2011-10-06T02:24:26.363 に答える