通常、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を使用して、特定の言語をチェックするだけでなく、特定の文字列内の特定の言語に属する特定の文字列を追跡することもできます。(証明:上記の方法による)。
上記のステートメントは正しいですか?