我是靠谱客的博主 调皮奇迹,最近开发中收集的这篇文章主要介绍flex+bison一起使用的超简单例子,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一个纯整数的计算器。

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一起使用的超简单例子所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部