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
)
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
)
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
);
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
)
120 return Interpreter::Value();
123 Interpreter::Value
Interpreter::operator()(ForStatement
<Iter
,Interpreter::Value
,FuncType
> &node
)
126 node
.children
[0]->accept(*this);
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
);
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
)
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
)
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
)
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
)
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());