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

  <script language="javascript" type="text/javascript">ocument.title="使用Antlr和JfreeChart实现项目源代码行数计算图表 - "+document.title</script>

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{

                                                        //调用LexerParser,得到行数并保存到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();

                                         

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

 

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

ModuleDocBuild

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值