extended Interpreter with ::need* functions, also extended File functions
[aqualang.git] / src / ops.statement.cpp
blob6a894c5c3a1f7db3c965eaf41fa19f4c27c101d8
2 #include "private.h"
3 using namespace Internal;
6 Interpreter::Value Interpreter::operator()(ExpressionStatement<Iter,Interpreter::Value,FuncType> &node)
8 return node.children[0]->accept(*this);
11 Interpreter::Value Interpreter::operator()(ReturnStatement<Iter,Interpreter::Value,FuncType> &node)
13 if(node.children.size()>0)
15 m_function_stack.push_back(node.children[0]->accept(*this));
17 return Interpreter::Value(typename Interpreter::Value::TagReturn());
21 Interpreter::Value Interpreter::operator()(EvalStatement<Iter,Interpreter::Value,FuncType> &node)
23 Interpreter::Value treeval = node.children[0]->accept(*this);
24 if(treeval.type() != Interpreter::Value::Type::Tree)
26 error("cannot eval non-tree.", node);
27 return Interpreter::Value();
29 return treeval.tree()->accept(*this);
33 Interpreter::Value Interpreter::operator()(Eval<Iter,Interpreter::Value,FuncType> &node)
35 Interpreter::Value treeval = node.children[0]->accept(*this);
36 if(treeval.type() != Interpreter::Value::Type::Tree)
38 error("cannot eval non-tree.", node);
39 return Interpreter::Value();
41 return treeval.tree()->accept(*this);
45 Interpreter::Value Interpreter::operator()(ParseStatement<Iter,Interpreter::Value,FuncType> &node)
47 Interpreter::Value val = node.children[0]->accept(*this);
48 if(val.type() != Interpreter::Value::Type::String)
50 error("parse argument needs to be string.", node);
51 return Interpreter::Value();
53 return Interpreter::Value(Interpreter::Value::Type::Tree, m_parser(val.string().begin(), val.string().end()));
56 Interpreter::Value Interpreter::operator()(ParseExpression<Iter,Interpreter::Value,FuncType> &node)
58 Interpreter::Value val = node.children[0]->accept(*this);
59 if(val.type() != Interpreter::Value::Type::String)
61 error("parse argument needs to be string.", node);
62 return Interpreter::Value();
64 return Interpreter::Value(Interpreter::Value::Type::Tree, m_parser.parse_expression(
65 val.string().begin(), val.string().end()));
69 Interpreter::Value Interpreter::operator()(StatementList<Iter,Interpreter::Value,FuncType> &node)
71 for(auto child : node.children)
73 Interpreter::Value result = child->accept(*this);
74 typename Interpreter::Value::Type t = result.internal_type();
75 if(t >= Interpreter::Value::Type::Return && t<= Interpreter::Value::Type::Continue)
77 return result;
80 return Interpreter::Value();
83 Interpreter::Value Interpreter::operator()(IfStatement<Iter,Interpreter::Value,FuncType> &node)
85 Interpreter::Value cond = node.children[0]->accept(*this);
86 if(cond.type() != Interpreter::Value::Type::Number)
88 error("if condition not a number.", node);
89 return Interpreter::Value();
91 if(cond.number() != 0.0)
93 return node.children[1]->accept(*this);
95 else if(node.children.size()>2)
97 return node.children[2]->accept(*this);
99 return Interpreter::Value();
102 Interpreter::Value Interpreter::operator()(WhileStatement<Iter,Interpreter::Value,FuncType> &node)
104 auto nullval = Value(0.0);
105 while(true)
107 auto cond = node.children[0]->accept(*this);
108 if(cond.type() != Interpreter::Value::Type::Number)
110 error("while condition not a number.", node);
112 if(cond == nullval)
114 break;
116 auto result = node.children[1]->accept(*this);
117 typename Interpreter::Value::Type t = result.internal_type();
118 if(t == Interpreter::Value::Type::Break || t == Interpreter::Value::Type::Return)
120 return result;
123 return Interpreter::Value();
126 Interpreter::Value Interpreter::operator()(ForStatement<Iter,Interpreter::Value,FuncType> &node)
128 LocalScope(*this);
129 auto nullval = Value(0.0);
130 node.children[0]->accept(*this);
131 while(true)
133 Interpreter::Value cond = node.children[1]->accept(*this);
134 if(cond.type() != Interpreter::Value::Type::Number)
136 error("while condition not a number.", node);
138 if(cond == nullval)
140 break;
142 Interpreter::Value result = node.children[3]->accept(*this);
143 typename Interpreter::Value::Type t = result.internal_type();
144 if(t == Interpreter::Value::Type::Break || t == Interpreter::Value::Type::Return)
146 return result;
148 node.children[2]->accept(*this);
150 return Interpreter::Value();
153 Interpreter::Value Interpreter::operator()(ForEachStatement<Iter,Interpreter::Value,FuncType> &node)
155 if(node.children.size()==3)
157 Interpreter::Value value = node.children[0]->accept(*this);
158 Interpreter::Value table = node.children[1]->accept(*this);
159 Interpreter::Value::Type t = table.type();
160 if(t != Interpreter::Value::Type::Table && t != Interpreter::Value::Type::Array)
162 error("for each argument is not a table or array", node);
164 LocalScope local(*this);
165 if(t == Interpreter::Value::Type::Table)
167 for(auto entry : *table.table())
169 setLocal(value, entry.second);
170 Interpreter::Value result = node.children[2]->accept(*this);
171 typename Interpreter::Value::Type result_t = result.internal_type();
172 if(result_t == Interpreter::Value::Type::Break || result_t == Interpreter::Value::Type::Return)
174 return result;
178 else
180 for(auto entry : *table.array())
182 setLocal(value, entry);
183 Interpreter::Value result = node.children[2]->accept(*this);
184 typename Interpreter::Value::Type result_t = result.type();
185 if(result_t == Interpreter::Value::Type::Break || result_t == Interpreter::Value::Type::Return)
187 return result;
192 else
194 Interpreter::Value key = node.children[0]->accept(*this);
195 Interpreter::Value value = node.children[1]->accept(*this);
196 Interpreter::Value table = node.children[2]->accept(*this);
197 if(table.type() != Interpreter::Value::Type::Table)
199 error("for each argument is not a table", node);
201 LocalScope local(*this);
202 for(auto entry : *table.table())
204 setLocal(key, entry.first);
205 setLocal(value, entry.second);
206 Interpreter::Value result = node.children[3]->accept(*this);
207 typename Interpreter::Value::Type t = result.type();
208 if(t == Interpreter::Value::Type::Break || t == Interpreter::Value::Type::Return)
210 return result;
214 return Interpreter::Value();
217 Interpreter::Value Interpreter::operator()(ContinueStatement<Iter,Interpreter::Value,FuncType> &)
219 return Interpreter::Value(typename Interpreter::Value::TagContinue());
222 Interpreter::Value Interpreter::operator()(BreakStatement<Iter,Interpreter::Value,FuncType> &)
224 return Interpreter::Value(typename Interpreter::Value::TagBreak());