我的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;
}[^ \t\n] {
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("%d\n", $3);
}
| exp {
printf("%d\n", $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, "%s\n", s);
return 0;
}