计算文本文件中的变量总数

时间:2014-07-24 11:42:43

标签: java

我想从java中的文本文件中计算变量的总数,为此我们使用此代码

try {
    BufferedReader reader = new BufferedReader(new FileReader(fn));
    String line = reader.readLine();

    while(line !=null)
    {
        Scanner fs = new Scanner(reader);
        while(fs.hasNext())
        {
            String s = fs.next();

            if( s.startsWith("int")) {
                s1 = ";" ;

                while(!(s1.equals(s2))){        
                    Scanner fd = new Scanner(reader);

                    while(fd.hasNext()){
                        c = fd.next();

                        if(c.contains(","))
                            cint++;
                        else
                            cint++;

                        if(c.startsWith(";"))
                            break;                                              
                    }

                    s2 = c ;           
                }                   
            }         

            if(s.startsWith("short")) {
                cshort++;
            }           
            if(s.startsWith("byte")) {
                cbyte++;
            }           
            if(s.startsWith("long")) {
                clong++;
            }           
            if(s.startsWith("float")) {
                cfloat++;
            }
            if(s.startsWith("boolean")) {
                cboolean++;
            }           
            if(s.startsWith("double")) {
                cdouble++;
            }
            if(s.startsWith("char")) {
                cchar++;
            }
            if(s.startsWith("abstract")) {
                cabstract++;
            }
            if(s.startsWith("continue")) {
                ccontinue++;
            }
            if(s.startsWith("switch")) {
                cswitch++;
            }
            if(s.startsWith("assert")) {
                cassert++;
            }
            if(s.startsWith("default")) {
                cdefault++;
            }
            if(s.startsWith("goto")) {
                cgoto++;
            }
            if(s.startsWith("package")) {
                cpackage++;
            }
            if(s.startsWith("synchronized")) {
                csync++;
            }
            if(s.startsWith("do")) {
                cdo++;
            }
            if(s.startsWith("if")) {
                cif++;
            }
            if(s.startsWith("private")) {
                cprivate++;
            }
            if(s.startsWith("this")) {
                cthis++;
            }
            if(s.startsWith("break")) {
                cbreak++;
            }
            if(s.startsWith("implements")) {
                cimplements++;
            }
            if(s.startsWith("protected")) {
                cprotected++;
            }
            if(s.startsWith("catch")) {
                ccatch++;
            }
            if(s.startsWith("extends")) {
                cextends++;
            }
            if(s.startsWith("try")) {
                ctry++;
            }
            if(s.startsWith("final")) {
                cfinal++;
            }
            if(s.startsWith("interface")) {
                cinterface++;
            }
            if(s.startsWith("static")) {
                cstatic++;
            }
            if(s.startsWith("void")) {
                cvoid++;
            }
            if(s.startsWith("instanceof")) {
                cinstanceof++;
            }
            if(s.startsWith("class")) {
                cclass++;
            }
            if(s.startsWith("finally")) {
                cfinally++;
            }
            if(s.startsWith("strictfp")) {
                cstrictfp++;
            }
            if(s.startsWith("volatile")) {
                cvolatile++;
            }
            if(s.startsWith("const")) {
                cconst++;
            }
            if(s.startsWith("native")) {
                cnative++;
            }
            if(s.startsWith("super")) {
                csuper++;
            }
            if(s.startsWith("while")) {
                cwhile++;
            }
            if(s.startsWith("for")) {
                cfor++;
            }
        }

        line = reader.readLine();                       
    }               
} catch (Exception ex) {
    System.out.println(ex.getMessage());                       
}

insert();

问题在于它给出错误的整数变量数 请帮助我这个

2 个答案:

答案 0 :(得分:0)

尝试添加其他内容,而不是百万ifs。如果一个变量以一个东西开头,它就不会从另一个开始。例如:

        if(s.startsWith("short")) {
            cshort++;
        }           
        else if(s.startsWith("byte")) {
            cbyte++;
        }  

这也将减少程序的编译时间。如果您可以访问该文件,则可以在单独的行中创建每个变量,以便于调试和读入。

答案 1 :(得分:0)

让我们看看试图计算int变量的代码:

        if( s.startsWith("int")) {
            s1 = ";" ;

            while(!(s1.equals(s2))){        
                Scanner fd = new Scanner(reader);

                while(fd.hasNext()){
                    c = fd.next();

                    if(c.contains(","))
                        cint++;
                    else
                        cint++;

                    if(c.startsWith(";"))
                        break;                                              
                }

                s2 = c ;           
            }                   
        }

为什么这会给出错误的计数?

  1. 您将以"int"开头的每个字词都视为int个关键字。但事实并非如此。那么internalinternational ...

  2. 呢?
  3. 评论中的int怎么样?评论应该被忽略。

  4. int[] myarray;怎么样?这不是int变量。它是int[]变量。

  5. return (int) someVariable;怎么样?这是一个类型转换,而不是声明。

  6. public int someMethod() { ... }怎么样?返回类型不是变量。

  7. public void method(int a, char b) { ... }怎么样?这是宣布int变量...但您的代码(我认为)会错误地将其计为两个int变量。

  8. 等等。


    您的方法最好描述为粗略的一次通过模式匹配,直接作为代码实现。基本上,这种“分析”源代码的方法注定要失败。

    您真正需要做的是使用识别Java语法的解析器正确解析 Java源代码。你可以:

    • 编写自己的Java解析器,或

    • 使用现有的Java解析器,或

    • 寻找适合输入ANTLR或JavaCC或其他Java解析器生成器系统(PGS)的现有Java语法。

    完成后,您可以遍历解析器发出的AST数据结构,也可以将“变量计数”代码嵌入到PGS输入文件的语法中。


    还有另一种方法(来自链接的Q& A)。编译源文件,使用Class.forName()加载它,然后使用反射来查找静态和实例变量的Field个对象。在紧要关头,您甚至可以通过Method对象计算方法签名中的参数。但局部变量不会被反射暴露出来......