1. linux下有没有什么好的代码统计工具
1 sloccount源代码行数统计工具
--------------------------------------------------------------------------------
sloccount=Count Source Lines Of Code
官网 : http://www.dwheeler.com/sloccount/
1.1 Ubuntu安装
--------------------------------------------------------------------------------
sudo apt-get install sloccount
1.2 使用
--------------------------------------------------------------------------------
sloccount [--version] [--cached] [--append] [ --datadir directory ]
[--follow] [--plicates] [--crossps] [--autogen] [--multiproject]
[--filecount] [--wide] [--details] [ --effort F E ] [ --schele F E ] [
--personcost cost ] [ --overhead overhead ] [ --addlang language ] [
--addlangall ] [--] directories
--cached
跳过计算过程,直接使用上次结果
参数
描述
–multiproject
如果该文件夹包括一系列的子文件夹,而它们中的每一个都是相对独立开发的不同的项目,那么使用”–multiproject”选项,评估将会正确的考虑到这一点
–filecount
显示文件数目而非代码行数
–details
显示每个源文件的详细信息
–plicates
算上所有重复的(默认情况下如果文件有相同的内容,则只算一个)
–crossps
如果顶目录包含几个不同的项目,并且你想把不同的项目下重复的文件在每个项目中都算上一次,则使用该选项
1.3 转换成html文件
--------------------------------------------------------------------------------
有一个sloc2html.py可以把生成的结果转换为带图形统计结果的html文件. 缺点是对中文支持不好
例如:
sloccount --wide --multiproject SourceDirectory > result.txt
sloc2html.py result.txt > result.html
再打开result.html即可看到结果形如:
下载地址 http://www.dwheeler.com/sloccount/sloc2html.py.txt
输出样例 http://www.dwheeler.com/sloccount/sloc2html-example.html
wget http://www.dwheeler.com/sloccount/sloc2html.py.txt -O sloc2html.py
sloc2html.py文件源代码如下
#!/usr/bin/env python
# Written by Rasmus Toftdahl Olesen <[email protected]>
# Modified slightly by David A. Wheeler
# Released under the GNU General Public License v. 2 or higher
from string import *
import sys
NAME = "sloc2html"
VERSION = "0.0.2"
if len(sys.argv) != 2:
print "Usage:"
print "\t" + sys.argv[0] + " <sloc output file>"
print "\nThe output of sloccount should be with --wide and --multiproject formatting"
sys.exit()
colors = { "python" : "blue",
"ansic" : "yellow",
"perl" : "purple",
"cpp" : "green",
"sh" : "red",
"yacc" : "brown",
"lex" : "silver"
# Feel free to make more specific colors.
"ruby" : "maroon",
"cs" : "gray",
"java" : "navy",
"ada" : "olive",
"lisp" : "fuchsia",
"objc" : "purple",
"fortran" : "purple",
"cobol" : "purple",
"pascal" : "purple",
"asm" : "purple",
"csh" : "purple",
"tcl" : "purple",
"exp" : "purple",
"awk" : "purple",
"sed" : "purple",
"makefile" : "purple",
"sql" : "purple",
"php" : "purple",
"mola3" : "purple",
"ml" : "purple",
"haskell" : "purple"
}
print "<html>"
print "<head>"
print "<title>Counted Source Lines of Code (SLOC)</title>"
print "</head>"
print "<body>"
print "<h1>Counted Source Lines of Code</h1>"
file = open ( sys.argv[1], "r" )
print "<h2>Projects</h2>"
line = ""
while line != "SLOC\tDirectory\tSLOC-by-Language (Sorted)\n":
line = file.readline()
print "<table>"
print "<tr><th>Lines</th><th>Project</th><th>Language distribution</th></tr>"
line = file.readline()
while line != "\n":
num, project, langs = split ( line )
print "<tr><td>" + num + "</td><td>" + project + "</td><td>"
print "<table width=\"500\"><tr>"
for lang in split ( langs, "," ):
l, n = split ( lang, "=" )
print "<td bgcolor=\"" + colors[l] + "\" width=\"" + str( float(n) / float(num) * 500 ) + "\">" + l + "=" + n + " (" + str(int(float(n) / float(num) * 100)) + "%)</td>"
print "</tr></table>"
print "</td></tr>"
line = file.readline()
print "</table>"
print "<h2>Languages</h2>"
while line != "Totals grouped by language (dominant language first):\n":
line = file.readline()
print "<table>"
print "<tr><th>Language</th><th>Lines</th></tr>"
line = file.readline()
while line != "\n":
lang, lines, per = split ( line )
lang = lang[:-1]
print "<tr><td bgcolor=\"" + colors[lang] + "\">" + lang + "</td><td>" + lines + " " + per + "</td></tr>"
line = file.readline()
print "</table>"
print "<h2>Totals</h2>"
while line == "\n":
line = file.readline()
print "<table>"
print "<tr><td>Total Physical Lines of Code (SLOC):</td><td>" + strip(split(line,"=")[1]) + "</td></tr>"
line = file.readline()
print "<tr><td>Estimated development effort:</td><td>" + strip(split(line,"=")[1]) + " person-years (person-months)</td></tr>"
line = file.readline()
line = file.readline()
print "<tr><td>Schele estimate:</td><td>" + strip(split(line,"=")[1]) + " years (months)</td></tr>"
line = file.readline()
line = file.readline()
print "<tr><td>Total estimated cost to develop:</td><td>" + strip(split(line,"=")[1]) + "</td></tr>"
print "</table>"
file.close()
print "Please credit this data as \"generated using 'SLOCCount' by David A. Wheeler.\"\n"
print "</body>"
print "</html>"
2. lex源代码
http://dinosaur.compilertools.net/#lex
flex source code :
ftp://ftp.gnu.org/non-gnu/flex/
ftp://prep.ai.mit.e/pub/gnu/
yacc:
http://www.monmouth.com/~wstreett/lex-yacc/lex-yacc.html
3. Android端有没有什么可以比较方便阅读Linux源码的工具
1. ctags
ctags应该是几个里面最古老的一个了,当然也是获得支持最多的一个,vim默认就支持ctags产生的tag数据库,不过原来的ctags名符其实, 只支持C语言,且分析不够细腻。其新版本名为exuberant ctags,但是它已经远远超出了它名字的范畴,支持包括C语言在内的33种编程语言,准确度上也不错,并且它的开发仍在如火如荼地进行着,前途无量啊!
配合vim使用,基本上能满足用户的要求。
常用命令:
建立数据库命令:
exuberant-ctags
在vim编辑器中浏览:
:ta x
跳转到符号x的定义处,如果有多个符号,直接跳转到第一处
:ts x
列出符号x的定义
:tj x
可以看做上面两个命令的合并,如果只找到一个符号定义,那么直接跳转到符号定义处,如果有多个,则让用户自行选择。
Ctrl+]
跳转到当前光标下符号的定义处,和ta类似。
Ctrl+t
跳转到上一个符号定义处,和上面的配合基本上就能自由跳转了。
另外两个:tn, :tp是在符号的多个定义之间跳转
美中不足,只能查找符号的定义,不能实现交叉引用查询等其它功能。
2. Cscope
相比ctags的只能查找符号的定义,cscope则显得更加丰富,虽然他支持C语言,但是它除了能查找函数的定义,还能查找函数在哪里被调用过等,所以能在一定程度上弥补ctags的不足。
常用命令:
建立数据库的命令:
cscope和vim配合使用:
不再重复vim文档了,自己通过命令
:help cscope
去详细学习吧。
比较遗憾的是,cscope的最后一次更新是在2003年,这个项目似乎也是被人抛弃了,希望以后能被人收养,或者和其它项目合并。
3. Global
Global是GNU出品的交叉索引工具,支持C, C++, Yacc, Java 和PHP4五种语言,命令行下表现不错,但是和vim配合使用,就不如前面两个更加亲切了。其特色在于分析得很细腻,我所研究过的,暂时只能 soucenav能超过它。能生成交叉索引的web页,很适合用来做程序的文档。数据库是从berkeley BD 3上改过来的。但和我的要需求却有比较大的差距。因为它只有一个WEB的前端,在功能上,他现有的前端也只实现符号查询和交叉引用查询。
4. 如何 编译 lex与yacc 源代码
逐步逐步的实现一个分析C/C++源代码的工具程序,但是每一章的结尾都会尽可能的给出一个可以编译通过的lex和yacc源程序。
lex 和 yacc是自动编译 C代码的工具,适合于解析简单的语言。这些工具经常用作编译器或者解释器的组成部分,或者用于读取配置文件。
Lex:一个词汇分析器生成器
词汇分析器不是在科幻展示中可以看到的小发明。它是一个将输入拆分为经过识别的片断的程序。 例如,一个简单的词汇分析器可能会为输入的单词进行计数。lex 可以接受规范文件并构建一个 相应的词汇分析器(用 C 编写的)。
acc:另一个编译器的编译器
这样,您已经将输入拆分为一连串的记号。现在您需要一些方法来识别高层次的模式。这 就是 yacc 要做的:yacc 让您可以描述希望怎样处理记号
5. 从php核心代码分析require和include的区别
普及
在php手册中:
require()isidenticaltoinclude()_ERRORlevelerror.Inotherwords,()onlyemitsawarning(E_WARNING).
就是说在失败的时候,require是会中止php运行的,而include是可以继续运行的。
倒底有什么样的区别呢?我们带着这个疑问来一起进入PHP的核心代码。
下面是一个PHP运行过程的图(这个图是出自哪里的?鸟哥画的?)
补习一下:lex是代码扫描器,扫描代码用的,yacc是Yet Another Compiler Compiler,作用是把任何一种代码的语法转成yacc语法,yacc就是解析器(真TMD绕)。
lex在c下的后缀是*.l yacc是*.y
正题
下面看操作记录:
cc@cc-laptop:/opt/workspace$svncheckouthttp://svn.php.net/repository/php/php-src/branches/PHP_5_3php-src-5.3
从svn取最新的php源代码。
开始深入:
cc@cc-laptop:/opt/workspace/php-src-5.3$find.-typef-name“*.l”-execgrep-Hn“require_once”{};./Zend/zend_language_scanner.l:1093:”require_once”{寻找lex代码扫描器文件中出现require_once的地方,zend_language_scanner.l的1093行。1093“require_once”{1094returnT_REQUIRE_ONCE;1095}
然后再搜一下T_REQUIRE_ONCE,
cc@cc-laptop:/opt/workspace/php-src-5.3$find.-typef-name“*.y”-execgrep-Hn“T_INCLUDE”{};./Zend/zend_language_parser.y:52:%leftT_INCLUDET_INCLUDE_ONCET_EVALT_REQUIRET_REQUIRE_ONCE./Zend/zend_language_parser.y:985:|T_INCLUDEexpr{zend_do_include_or_eval(ZEND_INCLUDE,&$$,&$2TSRMLS_CC);}./Zend/zend_language_parser.y:986:|T_INCLUDE_ONCEexpr{zend_do_include_or_eval(ZEND_INCLUDE_ONCE,&$$,&$2TSRMLS_CC);}
在985行附近,有这样一群代码:
internal_functions_in_yacc:T_ISSET‘(‘isset_variables‘)'{$$=$3;}|T_EMPTY‘(‘variable‘)'{zend_do_isset_or_isempty(ZEND_ISEMPTY,&$$,&$3TSRMLS_CC);}|T_INCLUDEexpr{zend_do_include_or_eval(ZEND_INCLUDE,&$$,&$2TSRMLS_CC);}|T_INCLUDE_ONCEexpr{zend_do_include_or_eval(ZEND_INCLUDE_ONCE,&$$,&$2TSRMLS_CC);}|T_EVAL‘(‘expr‘)'{zend_do_include_or_eval(ZEND_EVAL,&$$,&$3TSRMLS_CC);}|T_REQUIREexpr{zend_do_include_or_eval(ZEND_REQUIRE,&$$,&$2TSRMLS_CC);}|T_REQUIRE_ONCEexpr{zend_do_include_or_eval(ZEND_REQUIRE_ONCE,&$$,&$2TSRMLS_CC);};
于是乎,我们需要继续深入寻找zend_do_include_or_eval,
cc@cc-laptop:/opt/workspace/php-src-5.3$find.-typef-name“*.c”-execgrep-Hn“zend_do_include_or_eval”{};./Zend/zend_compile.c:4317:voidzend_do_include_or_eval(inttype,znode*result,constznode*op1TSRMLS_DC)/*{{{*/
zend_do_include_or_eval中组装了一个结构体,ZEND_INCLUDE_OR_EVAL。
再在zend_vm_def.h中找到ZEND_VM_HANDLER(73,ZEND_INCLUDE_OR_EVAL,CONST|TMP|VAR|CV,ANY):switch(Z_LVAL(opline->op2.u.constant)){代码略}
中间关键的一句是:new_op_array=compile_filename(Z_LVAL(opline->op2.u.constant),inc_filenameTSRMLS_CC);
在zend_complie.h文件中:ZEND_APIzend_op_array*compile_filename(inttype,zval*filenameTSRMLS_DC);
这个函数定义在zend_language_scaner.l文件中,找出最核心的代码:
if(open_file_for_scanning(file_handleTSRMLS_CC)==FAILURE){//require与include的差别:错误信息的显示级别(有lout和无lout)if(type==ZEND_REQUIRE){//require时zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN,file_handle->filenameTSRMLS_CC);zend_lout();}else{zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN,file_handle->filenameTSRMLS_CC);}compilation_successful=0;}else{代码略}
继续追踪zend_message_dispatcher可以在main/main.c文件中找到php_message_handler_for_zend函数:
//include输出错误信息时的级别为:E_WARNINGcaseZMSG_FAILED_INCLUDE_FOPEN:php_error_docref(“function.include”TSRMLS_CC,E_WARNING,“Failedopening‘%s'forinclusion(include_path='%s')”,php_strip_url_passwd((char*)data),STR_PRINT(PG(include_path)));break;//require输出错误信息时的级别为:E_COMPILE_ERROR
代码略
总结
和开头PHP手册所说完全一致,require和include的区别在于,出现错误时,一个是error一个是warning。
6. yacc编写的四元式生成器
正在做这个实验,大神求源代码
7. linux 下怎样安装使用 Yacc 和 Lex
yacc/lex在linux下的使用指南
链接:http://blog.csdn.net/ruglcc/article/details/7817619
Lex 和 Yacc 是 Unix 和Linux 下词法和语法的分析,解析工具,有了这两个工具,你可以自己制作想要的编译器,也可以重新制作已有程序语言的解析器。需要注意的是linux下的这两个工具生成的程序源码只能是C和C++语言,当然现在早已有类似可以生成Java源码的语法分析器,如较常用的JavaCC(Java Compiler Compiler),相关内容可以去网上搜索。Lex和Yacc已被移植到windows下,现在常用的工具有Parser Generator。本文只介绍Linux 下Lex和Yacc的使用方法。
Lex介绍
Lex 通过对.lex或.l文件定义的格式生成一个C语言源码文件,通过编译这个源码,就生成了.lex文件或.l文件定义的编译器。.lex或.l文件的格式分三段:
1.全局变量声明部分
2.词法规则部分
3.函数定义部分
以下是一个简单的例子:lex_example.l文件
%{ //全局声明部分
/*林木100 linux
www.linmu100.com
*/
#include
extern char *yytext;
extern FILE *yyin;
int sem_count = 0;
%}
//规则定义部分,
%%
[a-zA-Z][a-zA-Z0-9]* {printf("WORD[%s] ", yytext);}
[a-zA-Z0-9\/.-]+ printf("FILENAME ");
\" printf("QUOTE ");
\{ printf("OBRACE ");
\} printf("EBRACE ");
; {sem_count++; printf("SEMICOLON ");}
\n printf("\n");
[ \t]+ /* ignore whitespace */;
%%
//以下为函数定义部分
int main(int avgs, char *avgr[])
{
yyin = fopen(avgr[1], "r");
if (!yyin)
{
return 0;
}
yylex();
printf("sem_count : %d\n", sem_count);
fclose(yyin);
return 1;
}
8. 编译原理 词法分析 C 版 老师要求由编译原理课后PL0完整源代码改编
用LEX和YACC可以自动生成词法分析和语法分析。
你要分析什么语法,没有明确讲啊。
9. 求LEX源代码要C的
lex不开源
flex开源 flex不是lex的新版 而是对应类似功能重新写的软件,比lex更强大
http://flex.sourceforge.net/
10. 高分急求类pascal编译器的源代码(用lex和yacc做的,能够运行成功的 )
pascal 是虾米哟~~~??