概述
一个纯整数的计算器。
flex文件:
flex.l:
/*definitions : alias re-string*/
%{
#include <stdlib.h>
#include <stdio.h>
#include "bison.tab.h"
%}
number [0-9]+
%%
{number} {yylval = atoi(yytext);return NUM; }
[-+//*()^n] {return *yytext;}
[ t] ;
%%
/* 到达文件末尾的回调函数 */
int yywrap(void)
{
/* We reached the end of the input file... */
/* Should we continue with another file? */
/* If so:
* open the new file...
* return 0;
*/
/* to stop processing...
* return 1;
*/
return 1; /* Stop scanning at end of input file. */
}
可以看到仅仅就使用了一个NUM。
bison文件:
bison.y:
%{
#define YYSTYPE int
#include <math.h>
#include <stdio.h>
int yylex (void);
void yyerror (char const *);
%}
%token NUM
%left '-' '+'
%left '*' '/'
%left NEG /* negation--unary minus */ /* 负号 */
%right '^' /* exponentiation */ /* 幂运算 */
%% /* The grammar follows. */ /* 下面是语法 */
input: /* empty */
| input line
;
line: 'n'
| exp 'n' {
printf ("out:%dn", $1);
}
| error 'n' { yyerrok;}
;
exp: NUM { $$ = $1; }
| exp '+' exp { $$ = $1 + $3; }
| exp '-' exp { $$ = $1 - $3; }
| exp '*' exp { $$ = $1 * $3; }
| exp '/' exp { $$ = $1 / $3; }
| '-' exp %prec NEG { $$ = -$2; }
| exp '^' exp { $$ = pow ($1, $3); }
| '(' exp ')' { $$ = $2; }
;
%%
int main (void)
{
return yyparse ();
}
/* Called by yyparse on error. */
void yyerror (char const *s)
{
fprintf (stderr, "error:%sn", s);
}
编译命令:
bison -d bison.y && flex flex.l && gcc *.c -w -lm && ./a.out
这里虽然例子极为简单,要注意的细节还不少:
- flex.l中的#include "bison.tab.h",该头文件是bison 进行生成的,才能达到两者统一的目的
-
yylval = atoi(yytext); 在flex.l这一行十分重要,因为他将缓存在yytext中的字符进行了转换,以整数传递出去。
-
注意两者的内在联系,调用了yyparse(),bison是会去寻找yylex()的实现,而这里yylex函数是使用flex felx.l命令编译之后自动生成的
最后
以上就是调皮奇迹为你收集整理的flex+bison一起使用的超简单例子的全部内容,希望文章能够帮你解决flex+bison一起使用的超简单例子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复