2014-03-30 26 views
2

誰能告訴我如何編寫一個程序,我必須從文本文件中讀取ac程序,然後計算if-else語句的數量,不包括嵌套if-else。 在這個程序中,我已經計算了if和else從一個文本文件的數量,但是如何從這個計數中排除嵌套if? 請幫我。計數的if和else排除嵌套if-else的數量

package softwaretesting; 

import java.io.*; 
import java.util.Scanner; 

public class SoftwareTesting { 

public static void main(String[] args) throws IOException { 
    int countIf = 0, countElse = 0; 

    Scanner input; 
    input = new Scanner(System.in); 
    String fileName; 
    System.out.println("Enter the path of the file from which no of if and else statements are to be counted"); 

    fileName = input.next(); 


    Scanner file; 
    file = new Scanner(new File(fileName)); 

    int count=0; 
    while (file.hasNextLine()) 
    { 
     String line = file.nextLine(); 
     if (line.indexOf("if") != -1 && count%2==0) 
     { 
      countIf++; 
     } 


     if (line.indexOf("else") != -1 ) 
     { 
      countElse++; 
     } 


    } 


    { 
     System.out.println("No of If statements: " + countIf); 
     System.out.println("No of Else statements: " + countElse); 
    } 
} 
} 
+2

提示:計算括號。 –

+0

我確實嘗試過,但是如果在聲明中只有一行我們不使用大括號,那麼通常情況下該怎麼辦? – Aiman

+0

你需要在某個地方保持某種狀態。這意味着如果您目前處於if區塊中,請跟蹤。布爾值可以正常工作。另外,不要假設你不會在單行 – crush

回答

0

在一般情況下,if-else語句的計數方式在編程語言中是錯誤的if-else語句不僅包含ifelse(考慮評論中的'if'或'else'等詞語)。這正是一種語言中由一組特定規則定義的語言 - 語法。此外,您的代碼將成功從甚至沒有C程序,這可能是不正確的返回...

因此,解決問題的最終方法是爲輸入程序構建AST tree並遍歷它只計算頂級if-else語句。

有幾個工具可以幫助你做到這一點。

  1. ANTLR
  2. JavaCC

他們都可以生成從指定的語法語言剖析。您可以使用這些解析器來確定您輸入的程序包含哪些內容。

這種方法的主要問題是找到(創建?)正確的語法。例如,ANTLR(https://github.com/antlr/grammars-v4)和JavaCC(https://java.net/projects/javacc/downloads/directory/contrib/grammars)都有很多語法;但它們都不能用於生成AST - 只會產生簡單的解析。在另一方面,因爲您需要只計算if-else語句,你可能是件好事,只有解析(不AST樹)......

所以在這一點上有2級可能的解決方案:

  1. 手動由ANTLR/JavaCC分析器生成的更新來計算if-else語句。
  2. 查找/創建ANTLR/JavaCC的C語言來生成輸入程序的AST並遍歷它以搜索頂級if-else語句。

PS:有關更新語法來支持更多信息AST樹看到How to implement JJTree on grammar(JavaCC的)和How to output the AST built using ANTLR?(ANTLR)。

0

沒有看到原始文件讀取,我會使用正則表達式來計算if/else的總數,然後計算嵌套if/else的數量。結果的數學應該非常簡單... :)