14 #define STACK_DEPTH 256
26 CalculatorExpr(
const std::string &expr)
31 fail_stack.at(i) =
false;
44 }
else if (returnType().isFP()) {
45 const double *val = evalFP();
46 int dim = returnType().dim();
47 for (
int k = 0; k < 3; k++)
48 std::cerr << val[k] <<
" ";
49 std::cerr << std::endl;
57 std::cerr <<
"Return type FP(" << dim <<
") ignoring" << std::endl;
67 fail_stack.at(_count) =
true;
74 return stack.at(_count - 1).val;
93 void eval(
double *result)
override
95 for (
int k = 0; k < 3; k++)
99 void eval(
const char **)
override
106 mutable std::array<SimpleVar, STACK_DEPTH> stack;
107 mutable std::array<bool, STACK_DEPTH> fail_stack {};
108 mutable int _count {0};
111 ExprVarRef *resolveVar(
const std::string &name)
const override
113 if (name[0] ==
'_') {
114 int position = std::stoi(name.substr(1, name.size() - 1));
115 if (position >= count())
116 std::cerr <<
"Use of unused result line." << std::endl;
117 if (fail_stack.at(position))
118 std::cerr <<
"Use of invalid result line." << std::endl;
119 return &(stack.at(position));
128 std::cout <<
"KSeExpr Basic Calculator";
133 std::cout << std::endl << expr.count() <<
"> ";
135 getline(std::cin, str);
137 if (std::cin.eof()) {
138 std::cout << std::endl;
142 if (str ==
"quit" || str ==
"q")
144 expr.setDesiredReturnType(
ExprType().FP(3));
147 if (!expr.isValid()) {
149 std::cerr <<
"Expression failed: " << expr.parseError() << std::endl;
152 std::cout <<
" " << expr.peek();
void eval(ArgHandle args) override
static void cleanup()
cleanup all functions
abstract class for implementing variable references
const ExprStrNode * isString(const ExprNode *testee)