输入中缀表达式, 输出后缀表达式
例如: 输入 3+4*5 输出 345*+
G:
E :E+T {print ‘+’}
E :T
T :T*F {print ‘*’}
T :F
F :(E)
F :i {print ‘i’}
zh.lex文件
%{
/*
* 输入中缀表达式,输出后缀表达式
*/
#include <stdlib.h>
#include <math.h>
int yyerror(char*);
%}
%%
[0-9]+ {
yylval=atoi(yytext);
return INTEGER;
}
[+*\n] {return *yytext;}
%%
int yywrap(void)
{
return 1;
}
zh.y文件
%token INTEGER
%left '+'
%left '*'
%{
#include <stdio.h>
#include <ctype.h>
#define YYSTYPE int
int yyerror(char*);
int yylex(void);
%}
%%
program:
program statement '\n'
|
;
statement:
expr {printf("\n");}
;
expr : expr '+' term {printf("+");}
| term {$$ = $1;}
;
term : term '*' frex {printf("*");}
| frex {$$ = $1;}
;
frex : '(' expr ')' {$$ = $2;}
| INTEGER {printf("%d",$1);}
;
%%
int yyerror(char* s)
{
fprintf(stderr, "%s\n", s);
}
#include "lex.yy.c"
int main(void)
{
printf("fanyihouzhui.\n");
yyparse();
return 0;
}
运行结果: