bison和flex的例子

parser.l:

%{
    #include <stdio.h>
    int yylex(void);
    void yyerror(char *);
%}


%token INTEGER

%%

program:
        program expr '\n'         { printf("%d\n", $2); }
        |
        ;

expr:
        INTEGER                   { $$ = $1; }
        | expr '+' expr           { $$ = $1 + $3; }
        | expr '-' expr           { $$ = $1 - $3; }
        ;

%%

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

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

scanner.l

%{
    #include "y.tab.h"
    #include <stdlib.h>
    void yyerror(char *);
%}

%%

[0-9]+      {
                yylval = atoi(yytext);
                return INTEGER;
            }

[-+\n]      return *yytext;

[ \t]       ; /* skip whitespace */

.           yyerror("invalid character");

%%

这个编译器实现简单的加减,不支持括号。

编译:

bison -y -d parser.l
flex scanner.l
gcc -c y.tab.c lex.yy.c
gcc y.tab.o lex.yy.o -o plusmins.exe

以下是运行例:

[jialiang@host tmp]$ ./plusminis.exe
2+3
5
3+3+3-1
8

d
invalid character
syntax error

refs: http://epaperpress.com/lexandyacc/pry1.html