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
)
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);
107 auto cond
= node
.children
[0]->accept(*this);
108 if(cond
.type() != Interpreter::Value::Type::Number
)
110 error("while condition not a number.", node
);
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
)
123 return Interpreter::Value();
126 Interpreter::Value
Interpreter::operator()(ForStatement
<Iter
,Interpreter::Value
,FuncType
> &node
)
129 auto nullval
= Value(0.0);
130 node
.children
[0]->accept(*this);
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
);
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
)
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
)
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
)
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
)
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());