flex_改造中缀计算器为后缀计算器

后缀和中缀的区别就在于:其符号位置的不同

一个是 $$ = 1 + 2

一个是 $$ = 1 2 +

所以可以根据这样来修改我们的程序,进一步理解flex的作用 

calc.l

%{
#include "y.tab.h" 
%}
WHITESPACE      ([ \t]*)
%%
[0-9]+          { yylval = atoi(yytext); return T_NUM; }
[-/+*()@\n]      { return yytext[0]; }
{WHITESPACE}   {return T_WS;}
.               { return 0; /* end when meet everything else */ }
%%
 
int yywrap(void) { 
    return 1;
}

calc.y

%{
#include <stdio.h>
void yyerror(const char* msg) {}
%}


%token T_NUM T_WS
 
%left '+' '-'
%left '*' '/'
 
%%
 
S   :   S E '\n'        { printf("  ans = %d\n", $2); }
    |   /* empty */     { /* empty */ }
    ;
 
E   :   E T_WS E  T_WS '+'      { $$ = $1 + $3; }
    |   E T_WS E  T_WS '-'       { $$ = $1 - $3; }
    |   E T_WS E  T_WS '*'         { $$ = $1 * $3; }
    |   E T_WS E  T_WS '/'        { $$ = $1 / $3; }
    |   T_NUM           { $$ = $1; printf("数字是:%d",$1);        }
    |   '(' E ')'       { $$ = $2; printf("括号中%d间数字:%d\n",$1,$2); }
    ;
 
%%
 
int main() {
    return yyparse();
}

猜你喜欢

转载自blog.csdn.net/dyyzlzc/article/details/105672467