13.2 bison 示例 1¶
上面这段话可能不太容易理解,还是来看一个简单的例子吧。首先安装 bison ,在终端输入:
sudo apt-get install bison
安装完成后,新建一个文本文件,输入以下内容:
%{
#include "y.tab.h"
%}
%%
[0-9]+ { yylval = atoi(yytext); return T_NUM; }
[-/+*()\n] { return yytext[0]; }
. { return 0; /* end when meet everything else */ }
%%
int yywrap(void) {
return 1;
}
将此文件另存为 calc.l 。注意此文件中的 %% 、 %{ 、 %} 的前面不能有任何空格。
再新建一个文本文件,输入以下内容:
%{
#include
void yyerror(const char* msg) {}
%}
%token T_NUM
%left '+' '-'
%left '*' '/'
%%
S : S E '\n' { printf("ans = %d\n", $2); }
| /* empty */ { /* empty */ }
;
E : E '+' E { $$ = $1 + $3; }
| E '-' E { $$ = $1 - $3; }
| E '*' E { $$ = $1 * $3; }
| E '/' E { $$ = $1 / $3; }
| T_NUM { $$ = $1; }
| '(' E ')' { $$ = $2; }
;
%%
int main() {
return yyparse();
}
将此文件另存为 calc.y 。注意此文件中的 %% 、 %{ 、 %} 的前面也不能有任何空格。
将前面两个文件都放在终端的当前目录,再在终端输入:
bison -vdty calc.y
此时可以发现终端下多了三个文件: y.tab.h, y.tab.c, y.output 。
再在终端输入:
flex calc.l
此时终端下又多了一个文件: lex.