- 在安装flex和bison之后,需要准备一个待处理的输入文件。这个文件包含简单的算术表达式,例如:
2 + 3 * 4 - 5
- 在我们开始之前,让我们先定义一些符号。我们定义加、减、乘、除和左右括号的运算符。我们还定义数字。以下是我们的lex文件,也称为flex,flex是"fast lexical analyzer generator"的缩写。
%{
#include "y.tab.h"
%}
%%
"+" { return '+'; }
"-" { return '-'; }
"*" { return '*'; }
"/" { return '/'; }
"(" { return '('; }
")" { return ')'; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
[ \t\n] { }
. { printf("invalid character\n"); }
%%
- 使用以下命令编译lex文件并生成C代码:
flex calc.l
- 我们现在需要制定一个Bison的规则来分析我们的算术表达式。以下是一个简单的语法文件yacc文件:
%{
#include
%}
%token NUMBER
%%
expr : expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| '(' expr ')'
| NUMBER
;
%%
- 我们现在需要使用Bison来生成C代码。以下命令会编译yacc文件并生成C代码:
yacc -d calc.y
- 我们现在需要将lex生成的C代码与Bison生成的C代码进行编译和链接。以下命令将生成可执行文件:
cc lex.yy.c y.tab.c -o calc
- 输入以下内容以打印结果:
./calc
2 +