通常,DFA用于检查给定字符串是否以某种语言存在。 例如,_ab1c存在于C中的变量语言中。
我在做什么? 但正如this question中所述,我正在使用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,不仅可以检查特定语言 追踪某些字符串属于给定的某些语言 串。 (证明:按上述方法)。
我的上述陈述是否正确?
答案 0 :(得分:1)
我的陈述:我可以使用DFA,不仅可以检查特定语言,还可以查找属于给定字符串中某些语言的某些字符串。
我的上述陈述是否正确?
您的陈述非常正确。 可以使用DFA检查某些语言 。 (证据是存在的。如果任何这样的语言存在,那么你的陈述是真的。语言
<program> ::= 'A'
是满足存在证明的一个简单例子。)
但这不是一个特别有用的陈述,因为它没有说明可以使用DFA检查哪些种语言。
例如,如果您的评论语言支持嵌套评论块(正如某些历史编程语言所做的那样),那么DFA将无效。
您的陈述忽略的第二点是,对于给定语言,使用DFA是否实用。对于语法中具有所有形式的嵌套/递归的语言,您可以在理论上将语法转换为单个有限DFA。然而,DFA会如此之大,以至于无法实现。
(旁白 - 没有现代编程语言在语法层面有这样的界限......不是这个问题完全是关于编程语言。)
答案 1 :(得分:0)
你需要更多的州。您的DFA会打破多行评论。我非常确定您没有认识到*/
的“评论结束”序列。
是的,DFA可以识别这些类型的评论。容易。
大多数常见的编程语言不是常规语言,DFA无法识别。但是,有些是,而且可以。