我的GIS/CS学习笔记:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes <一个浙江大学本科生的计算机、地理信息科学知识库 >
要求
生成如下文法表示的表达式对应的计算器
代码语言:javascript复制 exp->exp exp | exp – exp
| exp * exp |exp / exp
|exp ^ exp | - exp
|(exp) |NUM
对于输入的中缀表达式,要给出结果。如 3 (4 * 5)结果应为 23。要求能连续处理若干个数学表达式,直到输入结束或文件结束。
lex
代码语言:javascript复制%{
#include <stdio.h>
#include "y.tab.h"
%}
%option noyywrap
%%
[0-9] {
yylval = atoi(yytext);
return NUMBER;
}
[^ tn] {
return yytext[0];
}
n {
return yytext[0];
}
. {}
%%
yacc
代码语言:javascript复制%{
#include <stdio.h>
#include <ctype.h>
#include <math.h>
%}
%code requires {
#define YYLTYPE int
#define YYSTYPE int
}
%token NUMBER
%%
command : exp1 {
}
;
exp1: exp1 'n' exp {
printf("%dn", $3);
}
| exp {
printf("%dn", $1);
};
exp : exp ' ' term {
$$ = $1 $3;
}
| exp '-' term {
$$ = $1 - $3;
}
| term { $$ = $1; }
;
term : term '*' factor {
$$ = $1 * $3;
}
| term '/' factor {
$$ = $1 / $3;
}
| factor { $$ = $1; }
;
factor : '-' numfactor {
$$ = - $2;
}
| numfactor '^' numfactor {
$$ = pow($1 , $3);
}
| numfactor { $$ = $1; }
;
numfactor : NUMBER { $$ = $1; }
| '(' exp ')' { $$ = $2; }
;
%%
int main() {
yyparse();
}
int yyerror(char *s) {
fprintf(stderr, "%sn", s);
return 0;
}