1. 文件结构
Flex和Bison的源代码文件都是由定义,规则,用户自定义函数三部分组成的,结构如下
{ definitions }
%%
{ rules }
%%
{ user subroutes }
2. 联合使用Flex和Bison
Flex和Bison各有一份自己的源代码,比如lexical.l和syntax.y,分别定义词法规则和语法规则,这两份源代码经过各自的处理后,分别生成一份词法分析器和语法分析器的源代码。词法分析器对文本进行初步处理后,向语法分析器返回一个个的词法单元(token),语法分析器再做后续处理。
引用逻辑是这样的,词法分析器返回的词法单元的定义,位于语法分析器中,而语法分析器需要使用词法分析器中提供的接口。Flex生成的词法分析器源代码叫做lex.yy.c,为了让语法分析器能够使用它提供的函数,我们直接在syntax.y的定义部分加上
%{
#include "lex.yy.c"
%}
位于%{
和%}
之间的代码会被直接拷贝到生成的语法分析器中。然后我们使用bison -d syntax.y
指令,会生成syntax.tab.h和syntax.tab.c,前者包含了词法单元的定义,而后者即为语法分析器的源代码。为了能在词法分析器中使用这些词法单元,我们在lexical.l的定义部分加上
%{
#include "syntax.tab.h"
%}
再使用flex lexical.l
即可生成词法分析器的源代码lex.yy.c。这份源代码其实已经被syntax.tab.c
包含了,所以需要编译的文件只有syntax.tab.c和新添加的main.c。完整的源码示例如下(MacOS,需要用-L指出fl库文件的位置)
// lexical.l
%{
#include <stdio.h>
#include <stdlib.h>
#include "syntax.tab.h"
%}
%%
"+" {
return ADD; }
"-" {
return SUB;