first impl of builtin member methods (thus far, string.size implemented. more to...
[aqualang.git] / src / ops.statement.cpp
blobdacfb937c0930c9dc5c4ef868df436ebb8321043
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());
20 Interpreter::Value Interpreter::operator()(EvalStatement<Iter,Interpreter::Value,FuncType> &node)
22 Interpreter::Value treeval = node.children[0]->accept(*this);
23 if(treeval.type() != Interpreter::Value::Type::Tree)
25 error("cannot eval non-tree.", node);
26 return Interpreter::Value();
28 return treeval.tree()->accept(*this);
31 Interpreter::Value Interpreter::operator()(Eval<Iter,Interpreter::Value,FuncType> &node)
33 Interpreter::Value treeval = node.children[0]->accept(*this);
34 if(treeval.type() != Interpreter::Value::Type::Tree)
36 error("cannot eval non-tree.", node);
37 return Interpreter::Value();
39 return treeval.tree()->accept(*this);
43 Interpreter::Value Interpreter::operator()(ParseStatement<Iter,Interpreter::Value,FuncType> &node)
45 Interpreter::Value val = node.children[0]->accept(*this);
46 if(val.type() != Interpreter::Value::Type::String)
48 error("parse argument needs to be string.", node);
49 return Interpreter::Value();
51 return Interpreter::Value(Interpreter::Value::Type::Tree, m_parser(val.string().begin(), val.string().end()));
54 Interpreter::Value Interpreter::operator()(ParseExpression<Iter,Interpreter::Value,FuncType> &node)
56 Interpreter::Value val = node.children[0]->accept(*this);
57 if(val.type() != Interpreter::Value::Type::String)
59 error("parse argument needs to be string.", node);
60 return Interpreter::Value();
62 return Interpreter::Value(Interpreter::Value::Type::Tree, m_parser.parse_expression(
63 val.string().begin(), val.string().end()));
67 Interpreter::Value Interpreter::operator()(StatementList<Iter,Interpreter::Value,FuncType> &node)
69 for(auto child : node.children)
71 Interpreter::Value result = child->accept(*this);
72 typename Interpreter::Value::Type t = result.internal_type();
73 if(t >= Interpreter::Value::Type::Return && t<= Interpreter::Value::Type::Continue)
75 return result;
78 return Interpreter::Value();
81 Interpreter::Value Interpreter::operator()(IfStatement<Iter,Interpreter::Value,FuncType> &node)
83 Interpreter::Value cond = node.children[0]->accept(*this);
84 if(cond.type() != Interpreter::Value::Type::Number)
86 error("if condition not a number.", node);
87 return Interpreter::Value();
89 if(cond.number() != 0.0)
91 return node.children[1]->accept(*this);
93 else if(node.children.size()>2)
95 return node.children[2]->accept(*this);
97 return Interpreter::Value();
100 Interpreter::Value Interpreter::operator()(WhileStatement<Iter,Interpreter::Value,FuncType> &node)
102 while(true)
104 Interpreter::Value cond = node.children[0]->accept(*this);
105 if(cond.type() != Interpreter::Value::Type::Number)
107 error("while condition not a number.", node);
109 if(cond == 0.0)
111 break;
113 Interpreter::Value result = node.children[1]->accept(*this);
114 typename Interpreter::Value::Type t = result.internal_type();
115 if(t == Interpreter::Value::Type::Break || t == Interpreter::Value::Type::Return)
117 return result;
120 return Interpreter::Value();
123 Interpreter::Value Interpreter::operator()(ForStatement<Iter,Interpreter::Value,FuncType> &node)
125 LocalScope(*this);
126 node.children[0]->accept(*this);
127 while(true)
129 Interpreter::Value cond = node.children[1]->accept(*this);
130 if(cond.type() != Interpreter::Value::Type::Number)
132 error("while condition not a number.", node);
134 if(cond == 0.0)
136 break;
138 Interpreter::Value result = node.children[3]->accept(*this);
139 typename Interpreter::Value::Type t = result.internal_type();
140 if(t == Interpreter::Value::Type::Break || t == Interpreter::Value::Type::Return)
142 return result;
144 node.children[2]->accept(*this);
146 return Interpreter::Value();
149 Interpreter::Value Interpreter::operator()(ForEachStatement<Iter,Interpreter::Value,FuncType> &node)
151 if(node.children.size()==3)
153 Interpreter::Value value = node.children[0]->accept(*this);
154 Interpreter::Value table = node.children[1]->accept(*this);
155 Interpreter::Value::Type t = table.type();
156 if(t != Interpreter::Value::Type::Table && t != Interpreter::Value::Type::Array)
158 error("for each argument is not a table or array", node);
160 LocalScope local(*this);
161 if(t == Interpreter::Value::Type::Table)
163 for(auto entry : *table.table())
165 setLocal(value, entry.second);
166 Interpreter::Value result = node.children[2]->accept(*this);
167 typename Interpreter::Value::Type result_t = result.internal_type();
168 if(result_t == Interpreter::Value::Type::Break || result_t == Interpreter::Value::Type::Return)
170 return result;
174 else
176 for(auto entry : *table.array())
178 setLocal(value, entry);
179 Interpreter::Value result = node.children[2]->accept(*this);
180 typename Interpreter::Value::Type result_t = result.type();
181 if(result_t == Interpreter::Value::Type::Break || result_t == Interpreter::Value::Type::Return)
183 return result;
188 else
190 Interpreter::Value key = node.children[0]->accept(*this);
191 Interpreter::Value value = node.children[1]->accept(*this);
192 Interpreter::Value table = node.children[2]->accept(*this);
193 if(table.type() != Interpreter::Value::Type::Table)
195 error("for each argument is not a table", node);
197 LocalScope local(*this);
198 for(auto entry : *table.table())
200 setLocal(key, entry.first);
201 setLocal(value, entry.second);
202 Interpreter::Value result = node.children[3]->accept(*this);
203 typename Interpreter::Value::Type t = result.type();
204 if(t == Interpreter::Value::Type::Break || t == Interpreter::Value::Type::Return)
206 return result;
210 return Interpreter::Value();
213 Interpreter::Value Interpreter::operator()(ContinueStatement<Iter,Interpreter::Value,FuncType> &)
215 return Interpreter::Value(typename Interpreter::Value::TagContinue());
218 Interpreter::Value Interpreter::operator()(BreakStatement<Iter,Interpreter::Value,FuncType> &)
220 return Interpreter::Value(typename Interpreter::Value::TagBreak());