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