Java 我可以使用DFA来跟踪特定语言的字符串吗?
通常,DFA用于检查给定字符串是否存在于特定语言中。 e、 g_ab1c出现在C的变量语言中 我在做什么? 但如中所述,我使用DFA跟踪所有注释、字符串等 我现在怎么样? 考虑在给定的字符串/程序中跟踪A//注释的例子。Java 我可以使用DFA来跟踪特定语言的字符串吗?,java,dfa,Java,Dfa,通常,DFA用于检查给定字符串是否存在于特定语言中。 e、 g_ab1c出现在C的变量语言中 我在做什么? 但如中所述,我使用DFA跟踪所有注释、字符串等 我现在怎么样? 考虑在给定的字符串/程序中跟踪A//注释的例子。 static int makeTransition[][] = { /* Transition Table */ /*{other,\n, \, /, *, ', "} */
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.
}
}
void assignPointerValuesInPairs(int索引)
{
/*注释是一个数组列表
在标记开始之前,热指针=-1
标记开始后,热指针=0
标记结束后,热指针重置为-1*/
开关(当前状态)
{
案例2:/*q2*/
添加(/*标记开始*/);
热指针=0;
打破
案例0:/*在初始状态q0*/
开关(热指针)
{
案例0://如果我在评论末尾。
注释。添加(/*标记结束*/);
hotPointer=-1;//重置hotPointer。
打破
案例-1:/*仅在第1季度已存在*/
/*无所事事*/
}
}
}
public static void traceOut(String s)//整个程序被接受为字符串。
{
int指数=0;
而(索引
我的问题是
我是否可以使用DFA,以这种方式标记//注释的结束和开始,
或者我必须遵循一些其他方式,如CFG等
i、 e
我的声明:我可以使用DFA,不仅可以检查特定的语言,还可以
以给定的方式跟踪属于特定语言的特定字符串
一串(证明:采用上述方法)
我的上述陈述正确吗
你需要更多的州。您的DFA在多行注释上中断。我很确定您没有识别
*/
的“注释结束”序列
是的,DFA可以识别这些类型的注释。很容易
大多数通用编程语言不是常规语言,DFAs无法识别。然而,有些是,也可能是
我的声明:我可以使用DFA,不仅可以检查特定语言,还可以在给定字符串中找出属于特定语言的特定字符串
我的上述陈述正确吗
你的说法完全正确。某些语言可以使用DFAs进行检查。
(证据是存在的。如果存在这样的语言,那么你的陈述是真实的。语言是什么
<program> ::= 'A'
::='A'
是满足存在性证明的一个简单示例。)
但这不是一个特别有用的语句,因为它没有说明使用DFA可以检查哪种语言
例如,如果您的注释语言支持注释块嵌套(正如某些历史编程语言所做的那样),那么DFA将不起作用
您的语句忽略的第二点是DFA的使用对于给定语言是否实用。对于语法中所有嵌套/递归形式都有边界的语言,理论上可以将语法转换为单个有限DFA。然而,DFA将如此之大,以至于无法实施
(旁白——现代编程语言在语法层面上没有这样的界限……这并不是说这个问题完全是关于编程语言的。)是的,我对所有注释、字符串、字符和文档进行了处理,共有11个状态。但为了准确起见,我提供了一个bcz样本。他们是否认识到使用CFG或通过上述方式的/**文档*/。+1表示“然而DFA将如此之大,以至于无法实现。”这一行消除了我的疑问。我还有一个疑问。我已经以这种方式实现了,正如您所说,我的DFA相当大。我正在写一个DFA来识别关键词。我可以将其合并到单个DFA中(状态将减少),或者我可以为此编写单独的DFA(需要更多的状态)。我要看什么?状态数或可读性?-