lex与yacc,flex与bison,javacc

在学习网上的文章编写自己的shell解释器的时候,接触到了lex与yacc。顺便了解了下。

Lex(LEXical compiler)和yacc(Yet Another Compiler Compiler)这两个工具是经典的词法分析和语法分析工具,在GNU/Linux下面的Lex是flex(fast lexical analyser generator), 而Yacc则是bison。它们都是基于C语言下面的工具,JAVA下lex和yacc的替代是javacc(Java Compiler Compiler ).

参考IBM网站上的教程 Yacc 与 Lex 快速入门 体验了下:

%{
    int wordCount = 0;
%}

chars [A-za-z_'."]
numbers ([0-9])+
delim [" "nt]
whitespace {delim}+
words {chars}+
%%

{words} { wordCount++; /*increase the word count by one*/ }
{whitespace} { /* do nothing*/ }
{numbers} { /* one may want to add some processing here*/ }
%%

int main()
{
    yylex(); /* start the analysis*/ 
    printf(" No of words: %dn", wordCount);
}

int yywrap()
{
    return 1;
}

文件存为 wordCount.lex

执行   flex wordCount.lex  会在当前目录下生成 lex.yy.c

执行   gcc lex.yy.c -lfl -o wordCount 就会编译生成可以执行文件wordCount

[baoniu@127.0.0.1 lex]$ cat input 
hello
world
123456
bao
niu
baoniu
[baoniu@127.0.0.1 lex]$ cat input | ./wordCount 
 No of words: 5

可以看到123456这样并没有统计在内,因为wordCount.lex定义的是遇到字母才行数加1.

发现这个博客不错,有个Lex和Yacc从入门到精通 系列。

发表评论

电子邮件地址不会被公开。 必填项已用*标注