2014-03-30 28 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的数量。结果的数学应该非常简单... :)