`
touchinsert
  • 浏览: 1340651 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

Antlr的功能在我的其他文章里提到了就不多说了,JFreeChart是一个功能强大的Java开源图表生成组件。

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

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

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 384pt; HEIGHT: 254.25pt" type="#_x0000_t75"><imagedata o:title="stat1" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>

<shape id="_x0000_i1026" style="WIDTH: 384pt; HEIGHT: 254.25pt" type="#_x0000_t75"><imagedata o:title="stat2" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.png"></imagedata></shape>

我越来越喜欢用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

分享到:
评论

相关推荐

    java代码行数统计源码

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

    java 必练题目

    - 图形化展示:使用Java 2D或第三方库如JFreeChart生成图表。 以上就是各个题目所涵盖的Java编程知识点,每个项目都能让学习者深入理解和应用Java的各种特性,同时锻炼到问题解决和系统设计能力。

    基于PHP+Mysql实现的酒店客房管理系统

    后端基于PHP+mysql,简单实现了预订、入住、结账以及客户信息维护等功能。年代久远,注释较少,功能简陋,仅供学习交流。

    springboot项目基于Hadoop的高校固定资产管理系统研究与实现_hot.zip

    springboot项目基于Hadoop的高校固定资产管理系统研究与实现_hot,含有完整的源码和报告文档

    基于AlexNet深度学习的11种中草药智能识别系统【python源码+c++ qt5界面+数据集+训练代码】目标识别、深度学习实战

    本文基于AlexNet深度学习模型,通过百度爬取的较少图片,训练了一个进行中草药的识别模型,可用于识别11种不同的中草药类型有:{'曼陀罗': 0, '白花蛇舌草': 1, '芍药': 2, '苍耳': 3, '蒲公英': 4, '薄荷': 5, '藿香': 6, '蛇莓': 7, '金银花': 8, '鸡蛋花': 9, '龙葵': 10}。并基于此模型开发了一款带UI界面的中草药智能识别系统,可用于识别场景中的中草药类别,更方便进行功能的展示。该系统是基于python与c++ QT5开发的,支持图片识别检测。本文提供了完整的Python代码和使用教程,给感兴趣的小伙伴参考学习。

    springboot项目基于协同过滤算法的私人诊所管理系统_to.zip

    springboot项目基于协同过滤算法的私人诊所管理系统_to,含有完整的源码和报告文档

    彩色铅笔形PPT柱形比例图-2.ppt

    图表分类ppt

    立体纸条效果时间轴PPT素材-4.ppt

    图表分类ppt

    Z源逆变器闭环仿真模型,并网,采用L滤波器

    Z源逆变器闭环仿真模型,并网,采用L滤波器。

    西门子PLC1500大型程序 汽车产线fanuc机器人焊装 2台触摸屏TP1500程序 9个智能远程终端ET200SP Profinet连接 15个Festo智能模块Profinet通讯 10台Fan

    西门子PLC1500大型程序 汽车产线fanuc机器人焊装 2台触摸屏TP1500程序 9个智能远程终端ET200SP Profinet连接 15个Festo智能模块Profinet通讯 10台Fanuc发那科机器人Profinet通讯 3台G120变频器Profinet通讯 2台智能电能管理仪表PAC3200 4个GRAPH顺控程序 图尔克RFID总线模组通讯 和MES系统通讯,西门子安全模块 程序经典,结构清晰,SCL算法,堆栈,梯形图 包含需要的GSD文件,博图V14以上版本均可打开,需要博图软件安装完整。 可以用来借鉴学习西门子大型程序的结构思路方法,通讯应用等

    四轴抓取视觉旋转标定源代码,学习机器视觉和运动控制的最佳例子,基于VS2015 C++ 实现,仿雅马哈四轴机械手抓取程序,实现把两个任意摆放的物料通过视觉算法和运动控制指令定位摆放到指定的位置并拼接起

    四轴抓取视觉旋转标定源代码,学习机器视觉和运动控制的最佳例子,基于VS2015 C++ 实现,仿雅马哈四轴机械手抓取程序,实现把两个任意摆放的物料通过视觉算法和运动控制指令定位摆放到指定的位置并拼接起来。 使用研华控制卡搭配工业相机实现,图像算法使用halcon实现,包含界面控制,图像采集,手动控制,图像建模,路径规划,运动仿真动画。 对需要做低成本替代进口机器人的四轴运动视觉方案的朋友具有极高的参考价值。

    花瓣形微立体四项并列PPT模板.pptx

    图表分类ppt

    esp32 can大于8字节分包传输协议,支持ping节点功能

    stm32 esp32 can大于8字节分包传输协议,支持ping节点功能

    php-redis中文帮助手册chm格式最新版本

    《PHP-Redis中文帮助手册》是由我突发灵感所编撰的参考资料。在编撰过程中,部分翻译内容参考了网络上的众多资料。遗憾的是,由于难以追溯,我无法确切知晓某些翻译内容的原始作者。在此,我向所有可能的贡献者表示感谢。 我自知英语水平和对Redis的使用经验都处于中等水平,因此手册中难免存在翻译误解和函数分类错误。我恳请读者们宽容使用此手册。同时,我热切期盼在文档翻译方面有经验的专家能够提供帮助。如果您有更优质的翻译,请不吝赐教,我将及时更新手册内容。我期待与大家进行更深入的交流。

    jsp+servlet+tomcat+mysql的javaee人事管理系统.zip

    ===如资源质量问题,可半价退款,代下全网资源,价格公道==== 【JavaEE人事管理系统详解】 JavaEE是一个广泛应用的企业级开发平台,它由Java SE(标准版)扩展而来,专为构建分布式、多层架构的应用而设计。在这个“jsp+servlet+tomcat+mysql的javaee人事管理系统”中,我们主要探讨四个关键组件:JSP(JavaServer Pages)、Servlet、Tomcat服务器以及MySQL数据库。 1. **JSP**:JavaServer Pages是JavaEE平台的一部分,用于创建动态网页。开发者可以在HTML页面中嵌入Java代码,使得网页能够与服务器进行交互,处理用户请求。在人事管理系统中,JSP通常用于展示数据,如员工信息、部门列表等,并能根据用户的操作(如搜索、添加、编辑、删除员工)进行动态更新。 2. **Servlet**:Servlet是Java编写的服务器端程序,用于扩展Web服务器的功能。在本系统中,Servlet接收来自JSP的请求,执行业务逻辑,例如处理数据验证、计算、数据库操作等,然后将结。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    新能源plc程序 欧姆龙nj系列程序,注释完整,面向对象的编程方法 ,多轴控制,凸轮同步,设备已经正常使用软件资料出概不 此项目程序已经实际设备成熟稳定应用,程序注释详细、非常适合用来欧姆龙NJ P

    新能源plc程序 欧姆龙nj系列程序,注释完整,面向对象的编程方法 ,多轴控制,凸轮同步,设备已经正常使用软件资料出概不 此项目程序已经实际设备成熟稳定应用,程序注释详细、非常适合用来欧姆龙NJ PLC大型项目学习,包括plc程序程序运用ST语言和FB块,可用作欧姆龙NJ大型项目编程模板直接调用

    Delphi 12 控件之BDE-Installer-for-RAD-Studio-10.2-Tokyo.7z

    BDE_Installer_for_RAD_Studio_10.2_Tokyo.7z

    西南科技大学密码学希尔密码实验

    内容概要:本文档是关于希尔密码加密与解密的实验报告,旨在帮助学生理解和掌握这一经典的密码学技术。通过随机生成密钥矩阵并实施明文的加密与解密步骤,加深对希尔密码运作机制的理解,并通过文件I/O操作巩固数据处理技能。此外,在实验过程中,作者还深入探讨了对合密钥的特点,分析为何这种类型的密钥不适合应用于实际情况,并给出了可能存在的具体对合密钥总数的求解方法。 适用人群:适用于计算机科学专业、信息安全方向的学生或研究人员,特别是那些有兴趣深入了解经典密码系统及其实现细节的人群。 使用场景及目标:本报告不仅作为课程作业的一部分提交,而且也可以作为研究参考资料使用。读者可以通过这份详细的报告学习到希尔密码的具体实现步骤,包括但不限于密钥的选择、密文的创建和恢复。此外,针对实验中存在的局限性进行了讨论,为后续相关领域的进一步探索提供了思考方向。 其他说明:文档详细记录了一个完整的实验流程,涵盖从实验环境搭建、关键步骤演示到最后结果呈现全过程,并就实际遇到的问题给出改进意见。对于初次接触此类概念的学习者来说非常友好。附录中还包括了C语言源码用于检测2*2维度内的所有有效'对合密钥’实例,证明数学推导的结果。

    【WUT编译原理实验】语法分析

    【问题描述】 请根据给定的文法设计并实现语法分析程序,能基于上次作业的词法分析程序所识别出的单词,识别出各类语法成分。输入输出及处理要求如下: (1)需按文法规则,用递归子程序法对文法中定义的所有种语法成分进行分析; (2)为了方便进行自动评测,输入的被编译源文件统一命名为testfile.txt;输出的结果文件统一命名为output.txt ;结果文件中包含如下两种信息: 1)按词法分析识别单词的顺序,按行输出每个单词的信息(要求同词法分析作业,对于预读的情况不能输出)。 2)在下列高亮显示的语法分析成分分析结束前,另起一行输出当前语法成分的名字,形如“<常量说明>”(注:未要求输出的语法成分仍需要分析)

    模型及MATLAB代码:考虑配送优先级的单服务点无人车配送路径优化问题 关键词:遗传算法、路径配送优化 完整模型+代码+注释 主要内容:以配送时间最短及物资满足率最高为目标,构建带时间和容量约束VRP

    模型及MATLAB代码:考虑配送优先级的单服务点无人车配送路径优化问题 关键词:遗传算法、路径配送优化 完整模型+代码+注释 主要内容:以配送时间最短及物资满足率最高为目标,构建带时间和容量约束VRP模型,在模型的基础上,结合遗传算法,通过MATLAB对模型求解,得出配送最短时间、最优满足率等数据。 服务内容:脚本 工具 部分展示如下:

Global site tag (gtag.js) - Google Analytics