`
lylyb
  • 浏览: 91123 次
  • 性别: Icon_minigender_1
  • 来自: 烟台
社区版块
存档分类
最新评论

使用Antlr和JfreeChart实现项目源代码行数计算图表

    博客分类:
  • JAVA
阅读更多
Antlr的功能在我的其他文章里提到了就不多说了,JFreeChart是一个功能强大的Java开源图表生成组件。

是不是经常有人问你,你做的项目一共有多少行代码,你编写了多少行代码?

本文的程序轻松帮你回答这个问题。



我越来越喜欢用Antlr来完成分析问题,虽然它在性能和简易性方面不如Lex/Yacc相比,那它能很容易的结合到Java项目里。



1 计算文件行数,和空行行数



//----------------------------------------------------------------------------

// The Colimas source statistics scanner

//----------------------------------------------------------------------------

header{

       package org.colimas.src.parser;

}

class SourceStatisticsParser extends Parser;

options {

       k = 2;                                   // two token lookahead

       codeGenMakeSwitchThreshold = 2;  // Some optimizations

       codeGenBitsetTestThreshold = 3;

       defaultErrorHandler = false;             

}



file :    //遍历文件

    (CODE)+  file  //有文字多行

       | (EMPTY)+ file //无文字多行

       | CODE       //文件最后一样

       | EOF        //文件结束符

       ;



      

class SourceStatisticsLexer extends Lexer;

options {

       testLiterals=true;                    // test for literals

       k=2;                   // 2 characters of lookahead

       codeGenBitsetTestThreshold=20;

       charVocabulary='\u0003'..'\uFFFF';

}

{

       private long codeline=0; //有字符行数

      

       private long emptyline=0; //空行行数

      

       private long totalline=0; //文件行数=有字符行数+空行行数

      

       public long getCodeline(){

              return this.codeline;

       }

      

       public long getEmptyline(){

              return this.emptyline;

       }

      

       public long getTotalline(){

              return this.codeline+this.emptyline;

       }

}

 

CHAR_LITERAL

       : ~('\uFFFF' | '\r' |'\n') //结束符,回车符,换行符以外的所有字符

       ;



CHAR  : (CHAR_LITERAL)+; //多个字符



EMPTY

  :   ('\r')? ('\n') // DOS/Windows

      // increment the line count in the scanner

      {

        newline(); //用于调试

        emptyline++;  //空行加1

        $setType(Token.SKIP);

      }

  ;

CODE :  CHAR  ( (('\r')? ('\n')) |'\uFFFF')

       {     

              newline();

              codeline++; }

       ;

该程序将被Antlr编译生成Java SourceStatisticsLexer类和SourceStatisticsParser类



2 保存行数

遍历指定一个目录内所有文件。

//递归方法

              public void passDirectory(File dir){

                            File[] files=dir.listFiles();

                            for(int i=0;i<files.length;i++){

                                          if(files[i].isDirectory()){

                                                        System.out.println(files[i].getAbsolutePath());

                                                        passDirectory(files[i]);

                                          }else{

                                                        //调用Lexer和Parser,得到行数并保存到hash表里。

                                                        setLineStat(files[i]);

                                          }

                                                       

                            }

                           

              }

//实例化Lexer分析器



              public void setLineStat(File file){

                                                        …

this.lexer=

                                                                      new SourceStatisticsLexer(in);

                                                        if(!FileExtension.checkAscii(type)){ //如果是文本文件则计算行数,否则跳过

                                                                      files.put(type,stat);

                                                                      return;

                                                        }

                                                        this.lexer.setFilename(file.getName());

//实例化Parser分析器



                                                        this.parser = new SourceStatisticsParser(lexer);

                                                        parser.file(); //遍历分析



//将行数保存到Map里



                                                        stat.addCodeLines(lexer.getCodeline());                                                                                         stat.addEmptyLines(lexer.getEmptyline());

                                                        files.put(type,stat);

///////////////////////////////////////////////////////////////////////////

计算所有文件的总行数

                                                        directoryCodeLines+=lexer.getCodeline();

                                                        directoryEmptyLines+=lexer.getEmptyline();

                                                        in.close();

                                          …

////////////////////////////////////////////////////////////////////////////

这样所有的文件行数将根据文件类型保存在以文件类型为Key的HashMap里。



3 生成饼状图与柱状图



饼状图与柱状图都需要先组织数据集,例如饼状图的数据集

              /**

               *<p>create data set </p>

               * @see org.colimas.src.graph.Chart#createDataset(java.util.Map)

               */

              public Dataset createDataset(Map files) {

        // row keys...

        Set keys=files.keySet();



        // create the dataset...

        DefaultPieDataset dataset = new DefaultPieDataset();

        Object[] types=(Object[])keys.toArray();

        for(int i=0;i<types.length;i++){

                    FileStat file=(FileStat)files.get(types[i]);

                    try {

                                  String desc=FileExtension.getFileDesc((String)types[i]);

                                  if(desc==null)

                                                desc="other files";

                                  String type=desc; //获得文件类型的文件描述

                dataset.setValue(type,file.getFiles());  //文件类型的文件数。

                                          } catch (Exception e) {

                                                        e.printStackTrace();

                                          }

                                         

        }

        return dataset;

              }

然后就能生成图表了

              /**

               *<p>create chart </p>

               * @see org.colimas.src.graph.Chart#createChart(org.jfree.data.general.Dataset)

               */

              public JFreeChart createChart(Dataset dataset) {

                            JFreeChart chart =null;

                            if (dataset instanceof PieDataset){

                                          chart = ChartFactory.createPieChart(

                          "File Statistics 1",  // chart title

                          (PieDataset)dataset,             // data

                          true,               // include legend

                          true,

                          false

                      );

                      PiePlot plot = (PiePlot) chart.getPlot();

                      plot.setSectionOutlinesVisible(false);

                      plot.setLabelFont(new Font("SansSerif", Font.PLAIN, 12));

                      plot.setNoDataMessage("No data available");

                      plot.setCircular(false);

                      plot.setLabelGap(0.02);

                            }

        return chart;

              }





4 显示

在JFrame的类里显示饼状图

              /**

     * Creates a panel

     * @return A panel.

     */

    public JPanel createPIEPanel(Map files) {

          PIEChart pie=new PIEChart();

        JFreeChart chart = pie.createChart(pie.createDataset(files));

        return new ChartPanel(chart);

    }

之后就像其他JPanel一样可以在JFrame里显示。



5 结果:

源代码可以在Colimas开源项目网站上下载

:pserver:anonymous@cvs.sourceforge.net:/cvsroot/colimas

Module为DocBuild

分享到:
评论

相关推荐

    java代码行数统计源码

    2. 源代码解析:Java代码需要被解析为抽象语法树(AST,Abstract Syntax Tree),这通常通过Java的`javac`编译器API或第三方库如ANTLR实现。解析后的AST能准确反映出代码结构,包括类、方法、变量等。 3. 代码行数...

    JavaEE源代码 antlr-2.7.6rc1

    JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源代码 antlr-2.7.6rc1JavaEE源...

    软件著作权代码行数计算程序,一键生成

    传统的手动统计方法不仅耗时而且容易出错,因而市面上应运而生了许多代码行数统计工具,其中“软件著作权代码行数计算程序”尤为引人注目。 该程序的便捷性体现在用户使用时的简易性。开发者仅需通过图形界面或者...

    c#开发的代码行数统计工具

    在IT行业中,代码行数(Lines of Code, LOC)经常被用作衡量软件项目规模的一种简单指标。C#是一种广泛使用的编程语言,尤其在开发Windows应用程序、游戏、服务器端应用等领域。本文将深入探讨如何利用C#开发一个...

    javaweb有效代码行数计算器

    在实现这样一个计算器时,开发者可能会使用诸如ANTLR这样的Java语法解析库来处理源代码,使用递归下降解析或编译器构造技术来识别有效代码。同时,为了提高效率,可能会采用预处理步骤来剔除明显的非代码行,然后再...

    antlr抽象语法树的构建

    ### ANTLR抽象语法树构建详解 #### 一、引言 在软件开发尤其是编译器设计领域,ANTLR 是一款非常流行的工具,用于构建解析器、词法...通过掌握 ANTLR 的使用技巧,开发者可以更加高效地构建高质量的解析器和编译器。

    使用Antlr+Stringtemplate生成method chaining 源代码

    使用Antlr+Stringtemplate生成method chaining,一个不太简单的案例(1) 因为一直上传失败,猜是因为附件太小,所以包含了antlr-3.4-complete-no-antlrv2.jar和antlrworks-1.4.3.jar。对浪费你的带宽抱歉。

    使用antlr4实现的CMM语言解释器

    在“使用ANTLR4实现的CMM语言解释器”项目中,可能存在一些已知的瑕疵,这可能会影响解释器的正确性和性能。开发者鼓励其他人独立完成并改进这个项目,这可能是为了促进学习和交流,让参与者深入理解语言解析和解释...

    antlr4计算器源代码.rar

    在这个“antlr4计算器源代码”项目中,开发者使用ANTLR4来构建一个简单的计算器应用。ANTLR4首先通过解析语法规则定义文件(通常扩展名为.g4)来生成解析器和词法分析器。这些生成的类能够识别并处理特定的语法结构...

    antlr实现的计算器

    在完成ANTLR语法文件的编写后,我们可以使用ANTLR工具将其编译成解析器和词法分析器的源代码。对于Java平台,这通常会产生`.java`文件,然后我们可以编译并运行这些文件。 运行生成的解析器,它会接收用户输入的...

    ANTLR-4-Resource-Code:ANTLR4权威指南源代码-代

    此外,由于这个资源标记为"系统开源",意味着ANTLR 4 是一个开放源码项目,开发者可以自由地使用、修改和分发ANTLR及其生成的代码,这鼓励了社区的参与和创新,使得ANTLR成为了一个强大且不断发展的工具。...

    基于ANTLR4的CMM语言编译器

    总结来说,"基于ANTLR4的CMM语言编译器"项目展示了如何使用ANTLR4工具来设计和实现一个编译器,包括文法定义、词法分析、语法分析、语义分析和代码生成等关键步骤。对于学习编译原理和实践编译器开发的人员来说,这...

    the Definitive ANTLR Reference 源代码 包含所有例子

    通过阅读和运行这些代码,你可以一步步探索ANTLR的强大功能,如如何定义词法规则、语法规则,如何处理输入文件,如何构建和遍历AST,以及如何利用ANTLR生成的解析器实现特定的编译器或解释器功能。 总的来说,这...

    开源项目-antlr-antlr4.zip

    1. **源代码**:ANTLR4 Go目标的实现,可能包括解析器和词法分析器的Go源码。 2. **测试用例**:为了验证和确保Go目标的正确性,通常会有相关的测试代码。 3. **示例**:可能会有一些示例文法文件和对应的输入示例,...

    Antlr4 C++ 计算器

    2. **语法生成**:ANTLR4工具会根据语法规则文件生成解析器和词法分析器的源代码。在C++中,这将生成解析器类和词法分析器类。 3. **解析输入**:在运行时,词法分析器将输入的数学表达式分解为一个个单独的标记...

    py3antlr4book, 隐藏ANTLR4图书源代码到Python3版本.zip

    py3antlr4book, 隐藏ANTLR4图书源代码到Python3版本 py3antlr4book隐藏ANTLR4图书源代码到 python 3版本。如何使用( Windows )安装 python安装 antlr4 python3运行时 pip install antlr4-python

    XML转XSD antlr4 java 实现

    总之,使用ANTLR4和Java实现XML到XSD的转换是一个涉及XML解析、语法分析和数据建模的过程。通过理解XML和XSD的结构,我们可以利用ANTLR4的强大功能,生成准确的XSD文件,从而更好地管理和验证XML数据。

Global site tag (gtag.js) - Google Analytics