2017-03-05 146 views
0

我试图使用.java文件中的条件来查找所有条件(我假定该文件只包含正确的指令)。 它应该计算所有的“如果”,但不包括那些与评论或锯齿串作为字符串的内容。 我试图用StringTokenizer来解决这个问题,但我不知道在“//”符号和字符串与“”绑定在一起后是如何省略的。“是否有可能通过这种方式来实现这个问题?在.java文件中查找是否有条件

public int getIfCount() 
{ 
    int counter = 0; 
    String t = ""; 

    try 
    { 
     FileReader file = new FileReader(path); 

     StringBuffer sb = new StringBuffer(); 

     int tmp; 

     while ((tmp = file.read()) != -1) 
     { 
      sb.append((char)tmp); 
     } 

     t = sb.toString(); 

     StringTokenizer stk = new StringTokenizer(t); 

     String token; 


     while (stk.hasMoreTokens()) 
     { 
      token = stk.nextToken(); 

      if (token.contains("/*")) 
      { 
       while (stk.hasMoreTokens()) 
       { 
        if (stk.nextToken().contains("*/")) 
         break; 
       } 
      } 
      else if (token.contains("//")) 
      { 
       while (stk.hasMoreTokens() && stk.nextToken() != "\n") 
       { 
        if (stk.nextToken().endsWith("\n")) 
         break; 
       } 
      } 
      else if (token.contains("\"")) 
      { 
       if (!token.endsWith("\"")) 
        while (stk.hasMoreTokens()) 
        { 
         if(stk.nextToken().contains("\"")) 
          break; 
        } 
      } 
      else if (token.startsWith("if")) 
       counter++; 
     } 
    } 

    catch (FileNotFoundException e) 
    { 
     System.out.println("This file does not exist!"); 
    } 
    catch (IOException e) 
    { 
     System.out.println("ERROR"); 
    } 

    return counter; 
} 
+0

要回答你问的问题,是的,这是可能的。编译器如何工作? –

+0

我建议你使用StringBuilder,因为StringBuffer已经在十多年前被弃用了。不要使用'startsWith',因为你可能有一个'iffy'令牌。如果代码没有达到您的期望值,我建议您逐步调试您的调试器中的代码。注意:您可以在注释中添加代码 –

+2

要涵盖所有边界案例,您需要完整进行Java词法分析,然后计算关键字“if”的出现频率。 (除了你提到的情况外,一个边界情况是unicode转义,'\ u0069f'也是一个“if”)。 – Henry

回答

0

无需自行实施。你在做什么是实现解析器的基础知识。尽管对解析时发生的事情有一些了解是很好的,但我建议使用一个库,如https://github.com/javaparser/javaparser。玩的开心。

+0

我的猜测是这是作业 –

+0

是的,它是...我不知道如何处理所以我需要一些提示,我可以使用什么构造。完成的解决方案是不合适的,我认为:(顺便说一句,我们假设“if”有合适的语法,所以只有注释和不同风格的编程,例如如果()等)是有问题的..正则表达式,而不是在那里工作?:( – maniekoo

+0

在这种情况下,你必须'char'由'char' imho,以跟踪是否可能发现'如果'也是一个有效的上下文(不是注释 - 多行或不行,不是另一个单词的一部分,无论它是变量,函数/方法还是类型)​​打开大括号和括号可能后跟一个空格,然后是一个'if '等等,这是相当复杂的东西,嗯,我希望你能得到一些启发,祝你好运。 – Brian

相关问题