加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
calculator.h 2.35 KB
一键复制 编辑 原始数据 按行查看 历史
ljy 提交于 2023-11-18 22:46 . init commit
#ifndef CALCULATOR_H_
#define CALCULATOR_H_
#include <assert.h>
#include <cstdint>
#include <cstdlib>
#include <exception>
#include <iomanip>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <string>
#define INFO 0
#define ERROR 1
#define PANIC 2
#define elog(level, format, ...) \
do { \
char buffer[1024]; \
snprintf(buffer, 1024, format " [%s:%d]\n", ##__VA_ARGS__, __FILE__, \
__LINE__); \
fprintf(stderr, buffer); \
if (level == ERROR) { \
throw std::runtime_error(buffer); \
} \
if (level == PANIC) { \
assert(0); \
} \
} while (0)
#define VALUE_INTEGER 'i'
#define VALUE_NUMBER 'n'
#define EXPR_VALUE 1
#define EXPR_NEGATE 2
#define EXPR_ADD 3
#define EXPR_SUB 4
#define EXPR_MUL 5
#define EXPR_DIV 6
#define EXPR_ABS 7
#define EXPR_MAX 8
typedef struct Value {
char value_type; /*VALUE_*/
union {
int64_t ingeger;
double number;
};
} Value;
#define IS_INTERGER(v) (v->value_type == VALUE_INTEGER)
typedef struct Expr {
char expr_type; /*EXPR_*/
Value* value;
Expr *left;
Expr *right;
} Expr;
double value_to_number(Value* v);
std::string value_to_string(const Value *value);
Value *make_integer(int64_t ingeger);
Value *make_number(double number);
Expr* make_value_expr(Value* v);
Expr* make_neate_expr(Expr* expr);
Expr* make_add_expr(Expr* left, Expr* right);
Expr* make_sub_expr(Expr* left, Expr* right);
Expr* make_mul_expr(Expr* left, Expr* right);
Expr* make_div_expr(Expr* left, Expr* right);
Expr* make_function_expr1(const char* func_name, Expr* arg);
Expr* make_function_expr2(const char* func_name, Expr* arg1, Expr* arg2);
Value *eval_expr(Expr *expr);
Value *my_calculator(const std::string& str);
#endif
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化