‘壹’ 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;
}
‘贰’ lex生成可执行程序时候 gcc -o exec lex.yy.c -ll 出错 错误提示为: /usr/lib64/gcc/x86_64-suse-linu
你可以试试:gcc -o exec lex.yy.c -lfl
‘叁’ 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>"
‘肆’ linux命令语法结构
以-开头的:开关(switch),可以多个开关选项并在一起,比如tar -xjvf test.tar.bz2;
[ ]:可选的参数,就是说如果你不需要那个参数对应的功能就可以不用那个参数;
< > :被替换的部分,通常是必须有的,比如tar -xjvf <你要解压缩的bz2档案的文件名>
|:“或者”之意。注意不要和shell符号||和|搞混了啊;
{ }:……楼主此例中好像没用花括号啊-_-||……
/:就是说你如果使用了prefixlex要在前面加上/符号。
希望对你有用!
PS:Linux中大多数命令都是服从上述规范编写的。但是注意一些古老的工具,如ps、tar,如下的命令调用也是合法的:
tar xjvf test.tar.bz2
ps ef
‘伍’ 用lex在linux下,C编译提示找不到lex.h咋回事
我查了一下, 感觉是不是你在VC++里一些设置步骤还没做? 在安装了Parser Generator后,执行以下步骤,即可使VC++编译和连接由Parser Generator产生的文件。 1.目录设置 在VC++中执行以下步骤,每个步骤只执行一次。