14 #define VM_CASE_UNARY(OP) case op_ ## OP: \
15 stack.back() = stack.back()._ ## OP(); \
20 #define VISITOR_UNARY(OP) else if (x.operator_ == #OP) code.push_back(op_ ## OP)
25 template <
class T_func>
26 void bin_op( std::vector<StackElement> &stack, T_func a_func) {
27 assert( stack.size() >= 2);
30 a_func(*second_last_elm, *last_elm);
36 std::vector<StackElement> stack;
37 stack.reserve(m_stackSize);
40 std::vector<StackElement>::const_iterator
pc =
code.begin();
44 if (stack.size() > max_stack_size) max_stack_size = stack.size();
46 switch (
pc[-1].asInt())
49 stack.back() = -std::move(stack.back());
53 stack.back() = !std::move(stack.back());
95 stack.emplace_back(
pc->valueFromProxy());
98 stack.emplace_back(*
pc);
105 if (stack.size()!=1){
106 throw std::runtime_error(
"ExpressionEvaluation: Virtual machine finished in undefined state. Is expression valid?");
116 void Compiler::operator()(
unsigned int n)
118 code.push_back(op_val);
121 void Compiler::operator()(
bool n)
123 code.push_back(op_val);
124 code.push_back((
int)
n);
126 void Compiler::operator()(
double n)
128 code.push_back(op_val);
131 void Compiler::operator()(
const std::string &
n)
133 const IUnitInterpreter *
units = m_unitInterpreter;
135 code.push_back(op_val);
137 if (
n ==
"pi")
code.push_back(3.14159265359);
138 else if (
n ==
"e")
code.push_back(2.71828182846);
139 else if (
n ==
"kBigNumber")
code.push_back(1234567890);
140 else if (
n ==
"kLeinGrossNummer")
code.push_back(123456789);
145 void Compiler::operator()(ast::operation
const&
x)
147 boost::apply_visitor(*
this,
x.operand_);
148 if (
x.operator_ ==
"&&")
code.push_back(op_and);
149 else if (
x.operator_ ==
"||")
code.push_back(op_or);
150 else if (
x.operator_ ==
"==")
code.push_back(op_eq);
151 else if (
x.operator_ ==
"!=")
code.push_back(op_neq);
152 else if (
x.operator_ ==
">")
code.push_back(op_gt);
153 else if (
x.operator_ ==
">=")
code.push_back(op_gte);
154 else if (
x.operator_ ==
"<")
code.push_back(op_lt);
155 else if (
x.operator_ ==
"<=")
code.push_back(op_lte);
156 else if (
x.operator_ ==
"+")
code.push_back(op_add);
157 else if (
x.operator_ ==
"-")
code.push_back(op_sub);
158 else if (
x.operator_ ==
"**")
code.push_back(op_pow);
159 else if (
x.operator_ ==
"*")
code.push_back(op_mul);
160 else if (
x.operator_ ==
"/")
code.push_back(op_div);
161 else BOOST_ASSERT(0);
164 void Compiler::operator()(ast::unaryexpr_
const&
x)
166 boost::apply_visitor(*
this,
x.operand_);
167 if (
x.operator_ ==
"-")
code.push_back(op_neg);
168 else if (
x.operator_ ==
"!")
code.push_back(op_not);
188 else if (
x.operator_ ==
"+") ;
189 else BOOST_ASSERT(0);
194 boost::apply_visitor(*
this,
x.first);
195 for(ast::operation
const& oper :
x.rest)