使用 lex + yacc 生成多种运算中缀表达式对应的计算器(代码实现)
2023-03-07 09:08:36 时间
我的GIS/CS学习笔记:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes <一个浙江大学本科生的计算机、地理信息科学知识库 >
要求
生成如下文法表示的表达式对应的计算器
exp->exp + exp | exp – exp
| exp * exp |exp / exp
|exp ^ exp | - exp
|(exp) |NUM
对于输入的中缀表达式,要给出结果。如 3 +(4 * 5)结果应为 23。要求能连续处理若干个数学表达式,直到输入结束或文件结束。
lex
%{
#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
%{
#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;
}
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的