轉自:http://blog.csdn.net/myhaspl/article/details/14445431
二、flex和bison聯合工作
1 、我們開始構造一個計算器程序。
創建flex代碼
/*計算器*/
%{
enum yytokentype{
NUMBER=258,
ADD=259,
SUB=260,
MUL=261,
DIV=262,
ABS=263,
EOL=264
};
int yylval;
%}
%%
"+" {return ADD;}
"-" {return SUB;}
"*" {return MUL;}
"/" {return DIV;}
"|" {return ABS;}
[0-9]+ {yylval=atoi(yytext);return NUMBER;}
\n {return EOL;}
[ \t] {/*空白忽略*/}
. {printf("非法字符 %c\n",*yytext);}
%%
main(int argc,char**argv)
{
int tok;
while(tok=yylex()){
printf("%d",tok);
if (tok==NUMBER) printf("=%d\n",yylval);
else printf("\n");
}
}
2、編譯
Administrator@2012-20121224HD /home/flexlinux
$ flex test2.l
Administrator@2012-20121224HD /home/flexlinux
$ gcc lex.yy.c -lfl
3、運行
Administrator@2012-20121224HD /home/flexlinux
$ ./a
- 12 66
260
258=12
258=66
264
Administrator@2012-20121224HD /home/flexlinux
$ ./a
/ 56 2 + |32
262
258=56
258=2
259
263
258=32
264
Administrator@2012-20121224HD /home/flexlinux
$
(2)計算器的BISON程序
- %{
- #include <stdio.h>
- %}
- %token NUMBER
- %token ADD SUB MUL DIV ABS
- %token EOL
- %%
- calclist:/**/
- |calclist exp EOL{printf ("=%d\n",$2);}
- ;
- exp:factor {$$ = $1;}
- |exp ADD factor{$$=$1+$3;}
- |exp SUB factor{$$=$1-$3;}
- ;
- factor:term {$$=$1;}
- |factor MUL term{$$=$1*$3;}
- |factor DIV term{$$=$1/$3;}
- ;
- term:NUMBER {$$=$1;}
- |ABS term {$$=$2>=0?$2:-$2;}
- ;
- %%
- main(int argc,char **argv){
- yyparse();
- }
- yyerror(char *s)
- {
- fprintf(stderr,"error:%s\n",s);
- }
liuxing@liuxing-HP-Pavilion-dv2700-Notebook-PC:~/test$ bison -d test2.y
liuxing@liuxing-HP-Pavilion-dv2700-Notebook-PC:~/test$ ls
test2.tab.c test2.tab.h test2.y test2.y~
然後,修改剛纔的flex文件,將其命名爲test21.l
test2.tab.h中包含了記號編號的定義和yylval的定義,因此,將其第一部分的相關定義刪除,並改爲:
/*計算器*/
%{
#include "test2.tab.h"
%}
然後刪除,其第三部分的main函數。
最後,進行編譯。
bison -d test2.y
flex test21.l
gcc test2.tab.c lex.yy.c -lfl
可以測試一下
root@myhaspl:~# ./a.out
12 + 36 * 2
=84
12 / 6 + 2 * 3
=8