使用 lex + yacc 生成多种运算中缀表达式对应的计算器(代码实现)
代码 实现 使用 生成 运算 表达式 多种 对应
2023-06-13 09:16:58 时间
我的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;
}
相关文章
- AI实现代码转换,Python转Java,Java转Go不再困难?
- android Titlebar一行代码实现沉浸式效果详解手机开发
- 关键字检索高亮标出-javasript/jQuery代码实现详解编程语言
- 实现使用Java代码实现MySQL数据库连接(java连接mysql数据库代码)
- 使用C语言连接Oracle的编程实现(c连接oracle的代码)
- 分析使用Redis实现队列功能的案例与代码分析(redis队列案例代码)
- 使用模板实现ASP代码与页面分离
- ajax实现的提交文章前进行敏感词审核的代码
- ASP.NET中实现jQueryValidation-Engine的Ajax验证实现代码
- Javascript键盘事件的组合使用实现代码
- js防止表单重复提交实现代码
- 实现网页内容水平或垂直滚动的Javascript代码
- 通过正则格式化url查询字符串实现代码
- 使用perl清理电脑上重复文件实现代码(续)
- perl跳过首行读取文件的实现代码
- 使用python实现baiduhi自动登录的代码
- Asp.net中使用PageDataSource分页实现代码
- 使用js检测浏览器的实现代码
- 使用非html5实现js板连连看游戏示例代码
- javahashtable实现代码
- 使用原生js实现页面蒙灰(mask)效果示例代码
- 使用mini-define实现前端代码的模块化管理
- Android实现抽奖转盘实例代码