flex & bison学习(三)

简介: GNU bison是一个自由软件,用于自动生成语法分析器程序,实际上可用于所有常见的操作系统。Bison把LALR形式的上下文无关文法描述转换为可做语法分析的C或C++程序。在新近版本中,Bison增加了对GLR语法分析算法的支持。

GNU bison是一个自由软件,用于自动生成语法分析器程序,实际上可用于所有常见的操作系统。Bison把LALR形式的上下文无关文法描述转换为可做语法分析的CC++程序。在新近版本中,Bison增加了对GLR语法分析算法的支持。

GNU bison基本兼容Yacc,并做了一些改进。它一般与flex一起使用。

下面是一个简单的计算器的文法描述Bison程序

/* simplest version of calculator */

%{
#  include <stdio.h>
%}

/* declare tokens */
%token NUMBER
%token ADD SUB MUL DIV ABS
%token OP CP
%token EOL


%%

calclist: /* nothing */
 | calclist exp EOL { printf("= %d\n> ", $2); }
 | calclist EOL { printf("> "); } /* blank line or a comment */
 ;

exp: factor
 | exp ADD exp { $$ = $1 + $3; }
 | exp SUB factor { $$ = $1 - $3; }
 | exp ABS factor { $$ = $1 | $3; }
 ;

factor: term
 | factor MUL term { $$ = $1 * $3; }
 | factor DIV term { $$ = $1 / $3; }
 ;

term: NUMBER
 | ABS term { $$ = $2 >= 0? $2 : - $2; }
 | OP exp CP { $$ = $2; }
 ;
%%

int main()
{
    yyparse();
    return 0;
}

int yyerror(char *s)
{
  fprintf(stderr, "error: %s\n", s);
}

 

对应的flex词法分析器为


/* recognize tokens for the calculator and print them out */

%{
# include "fb1-5.tab.h"
%}
%option noyywrap

%%
"+"    { return ADD; }
"-"    { return SUB; }
"*"    { return MUL; }
"/"    { return DIV; }
"|"     { return ABS; }
"("     { return OP; }
")"     { return CP; }
[0-9]+    { yylval = atoi(yytext); return NUMBER; }

\n      { return EOL; }
"//".*  
[ \t]   { /* ignore white space */ }
.    { yyerror("Mystery character %c\n", *yytext); }
%%


按照如下顺序编译出fb1-5即可
bison -d fb1-5.y
flex fb1-5.l
cc -o fb1-5 fb1-5.tab.c lex.yy.c -lfl


相关文章
|
Web App开发 前端开发 算法
CSS - Flex 之最直观的方式学习 Flexbox 属性(一)
CSS - Flex 之最直观的方式学习 Flexbox 属性(一)
151 1
CSS - Flex 之最直观的方式学习 Flexbox 属性(一)
|
前端开发 容器
CSS - Flex 之最直观的方式学习 Flexbox 属性(四)
CSS - Flex 之最直观的方式学习 Flexbox 属性(四)
148 0
CSS - Flex 之最直观的方式学习 Flexbox 属性(四)
CSS - Flex 之最直观的方式学习 Flexbox 属性(三)
CSS - Flex 之最直观的方式学习 Flexbox 属性(三)
113 0
CSS - Flex 之最直观的方式学习 Flexbox 属性(三)
|
前端开发 容器
CSS - Flex 之最直观的方式学习 Flexbox 属性(二)
CSS - Flex 之最直观的方式学习 Flexbox 属性(二)
135 0
CSS - Flex 之最直观的方式学习 Flexbox 属性(二)
|
前端开发 容器
flex学习
css flex
1172 0
|
Web App开发 JavaScript Java
flex学习
早就想弄个flex的东西了...总是没有心情弄..有的时候项目让人心力憔悴...   最近,,想着是破罐子破摔..弄点别的东西...换个心情..然后在去弄下项目...(已经快接近尾声了)   总是在开发的第一线..技术上面什么都弄..公司里面还要应付其他同事的问题...   能帮助别人就帮助吧..本人也没有别的什么有点..就代码上面略有研究.(投入的时间多了自然就有所领悟了)   1,先弄个s
1315 0