Java 我可以使用DFA来跟踪特定语言的字符串吗?

Java 我可以使用DFA来跟踪特定语言的字符串吗?,java,dfa,Java,Dfa,通常,DFA用于检查给定字符串是否存在于特定语言中。 e、 g_ab1c出现在C的变量语言中 我在做什么? 但如中所述,我使用DFA跟踪所有注释、字符串等 我现在怎么样? 考虑在给定的字符串/程序中跟踪A//注释的例子。 static int makeTransition[][] = { /* Transition Table */ /*{other,\n, \, /, *, ', "} */

通常,DFA用于检查给定字符串是否存在于特定语言中。 e、 g_ab1c出现在C的变量语言中

我在做什么? 但如中所述,我使用DFA跟踪所有注释、字符串等

我现在怎么样? 考虑在给定的字符串/程序中跟踪A//注释的例子。

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(需要更多的状态)。我要看什么?状态数或可读性?-