2017-03-05 5 views
0

.javaファイルの条件をすべて調べる方法を試しました。 "if"はすべてカウントする必要がありますが、コメント付きで囲まれているか、文字列として処理されているものではありません。 私は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

StringBufferは10年以上前に廃止されたので、StringBuilderを使用することをお勧めします。 'iffy'トークンを持つかもしれないので、' startsWith'を使わないでください。コードが期待したことをしていない場合は、デバッガのコードをステップ実行することをお勧めします。注:あなたはコメントにコードをつけることができます –

+2

すべての国境をカバーするには、完全なJava字句解析を行い、キーワード「if」がどれくらい出現したかをカウントする必要があります。 (あなたが言及したケースとは別の境界ケースはユニコードのエスケープです。\ u0069fはまた "if"です)。 – Henry

答えて

0

自分で実装する必要はありません。あなたがやっていることは、パーサーの基礎を実装することです。解析時に何が起こっているのか分かりましたが、https://github.com/javaparser/javaparserのようなライブラリを使うことをお勧めします。楽しむ。

+0

私の推測は宿題です –

+0

はい、それはどうですか?それで、私は使用できる構造をいくつか知っておく必要があります。完成した解決法は適切ではないと私は思います。 Regexはあまりうまく動作しないでしょうか?:( – maniekoo

+0

その場合、潜在的に見つかった 'if'も' char'を使って 'char'を実行する必要があります有効な文脈(コメントではなく、複数の行であるかどうか、別の単語の一部ではなく、変数、関数/メソッド、または型である)を指定することができます。 'など、これはかなり複雑なものです。まあ、私はあなたが/得るいくつかのインスピレーションを願っています。幸運。 – Brian