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 是蝦米喲~~~??