Yacc 与 Lex 快速入门(词法分析和语法分析)
https://blog.csdn.net/judyge/article/details/41017949
YACC = bison -y //yacc是个语法分析器 生成的文件后缀为.Y
LEX = flex //词法分析器,生成的文件后缀为.L
OBJS = y.tab.o lex.yy.o $(SOURCES:.c=.o) timestamp.o //$(SOURCES:.c=.o)用了替换,将SOURCES中的.c替换成了.o
boa_indexer: index_dir.o escape.o
$(CC) -o $@ $^ $(LDFLAGS) $(LIBS)
clean:
rm -f $(OBJS) boa core lex.yy.c y.tab.c y.tab.h *~ boa_indexer index_dir.o *.d
# parser dependencies
y.tab.c y.tab.h: boa_grammar.y
$(YACC) -d $^
lex.yy.c: boa_lexer.l
$(LEX) $^
timestamp.o: $(SOURCES) boa_grammar.y boa_lexer.l
// 用gcc -MM可以生成源文件的依赖关系,.depend文件原来都有了,可以make depend重新制作
因为是非计算机本科,所以没有学编译原理,进来想补补课,于是买了本《自制编程语言》,里面介绍了lex和yacc工具,于是装起来试了下。
原来用工具来解析字符串还是挺方便的,以前知道正则以后,就觉得这东西很好,现在有了lex和yacc,把正则能做的事情又放大了,能够做更丰富的事情。
例如,写一个简单的把字符串里的数字相加,其他忽略的程序(说是简单是指功能,其实调通很不简单,哈哈,特别是把%type写成了%token的笔误后,纠结了很久)
如果你有Unix环境的编程经验,想必你肯定遇到过神秘的Lex和YACC工具,在GUN/Linux中,又分别称作Flex和Bison,其中Flex是由Vern Paxon实现的Lex版本,Bison是GUN版本的YACC.我们统一称他们为Lex和YACC,这些新版本是向上兼容的,因此你可以在我们的示例中使用Flex以及Bison.
这两个程序是非常有用的,但是跟C编译器一样,它的用户手册上即不会解释C语言,也不会告诉你如何使用C语言。YACC与Lex一起使用时非常有用,然而,Bison用户手册并没有介绍如何将Lex代码集成到Bison程序里。
关于Lex&YACC的巨作有很多。如果需要了解更多,你应该阅读它们。它们提供的信息比本文多的多。参考文章未尾"Further Reading"章节。本文的目的是通过实例引导你如何使用Lex&YACC。
Flex及BISON自带的文档非常优秀,但并非教程。
我无意成为Lex&YACC专家。当我开始写此文章时,不过接触它们两天而已。我所做的只是想让这两天对你而言会更轻松。
能力有限,不要期望文章能够恰如其份符合Lex&YACC风格。示例保持的尽量简单,可能有更好的方法,你可以写在下面的评论里。
使用恰当的话,这两个程序能够让你更容易的解析复杂的语言。例如读取配置文件,或者为你自己发明的编程语言写一个编译器。
通过本文,你会发现,有了Lex&YACC这两个工具,你永远不需要自己手工写一个解析程序。