4 using namespace Internal
;
6 Interpreter::Value
Interpreter::operator()(Variable
<Iter
,Interpreter::Value
,FuncType
> &node
)
11 Interpreter::Value
Interpreter::operator()(FieldName
<Iter
,Interpreter::Value
,FuncType
> &node
)
16 Interpreter::Value
Interpreter::operator()(Constant
<Iter
,Interpreter::Value
,FuncType
> &node
)
21 Interpreter::Value
Interpreter::operator()(Nop
<Iter
,Interpreter::Value
,FuncType
> &)
23 return Interpreter::Value(1.0);
26 Interpreter::Value
Interpreter::operator()(Nil
<Iter
,Interpreter::Value
,FuncType
> &)
28 return Interpreter::Value();
31 Interpreter::Value
Interpreter::operator()(String
<Iter
,Interpreter::Value
,FuncType
> &node
)
36 Interpreter::Value
Interpreter::operator()(Parens
<Iter
,Interpreter::Value
,FuncType
> &node
)
38 return node
.children
[0]->accept(*this);
42 Interpreter::Value
Interpreter::operator()(Type
<Iter
,Interpreter::Value
,FuncType
> &node
)
44 Interpreter::Value expr
= node
.children
[0]->accept(*this);
47 case Interpreter::Value::Type::String
:
48 return Interpreter::Value(std::string("string"));
49 case Interpreter::Value::Type::Number
:
50 return Interpreter::Value(std::string("number"));
51 case Interpreter::Value::Type::Tree
:
52 return Interpreter::Value(std::string("tree"));
53 case Interpreter::Value::Type::Function
:
54 return Interpreter::Value(std::string("function"));
55 case Interpreter::Value::Type::Table
:
56 return Interpreter::Value(std::string("table"));
57 case Interpreter::Value::Type::Array
:
58 return Interpreter::Value(std::string("array"));
59 case Interpreter::Value::Type::Nil
:
60 return Interpreter::Value(std::string("nil"));
62 error("unknown type", node
);
63 return Interpreter::Value();
67 Interpreter::Value
Interpreter::operator()(Size
<Iter
,Interpreter::Value
,FuncType
> &node
)
69 Interpreter::Value expr
= node
.children
[0]->accept(*this);
72 case Interpreter::Value::Type::String
:
73 return Interpreter::Value(expr
.string().size());
74 case Interpreter::Value::Type::Number
:
75 return Interpreter::Value(1);
76 case Interpreter::Value::Type::Tree
:
77 return Interpreter::Value(expr
.pointer()->size());
78 case Interpreter::Value::Type::Function
:
79 return Interpreter::Value(expr
.pointer()->size());
80 case Interpreter::Value::Type::Table
:
81 return Interpreter::Value(expr
.table()->size());
82 case Interpreter::Value::Type::Array
:
83 return Interpreter::Value(expr
.array()->size());
84 case Interpreter::Value::Type::Nil
:
85 return Interpreter::Value(0.0);
87 error("unknown type", node
);
88 return Interpreter::Value();
92 Interpreter::Value
Interpreter::operator()(FieldAccess
<Iter
,Interpreter::Value
,FuncType
> &node
)
94 Interpreter::Value left
= node
.children
[0]->accept(*this);
95 if(left
.type() == Interpreter::Value::Type::Table
)
97 Interpreter::Value right
= node
.children
[1]->accept(*this);
98 return left
.table()->get(right
);
100 else if(left
.type() == Interpreter::Value::Type::Array
)
102 Interpreter::Value right
= node
.children
[1]->accept(*this);
103 if(right
.type() != Interpreter::Value::Type::Number
|| !isint(right
.number()))
105 error("array index not a integer.", node
);
107 int idx
= right
.number();
108 if(idx
<0 || idx
>=int(left
.array()->size()))
110 error("array index out of range.", node
);
112 return left
.array()->get(right
);
116 error("can only index tables or arrays.", node
);
117 return Interpreter::Value();
121 Interpreter::Value
Interpreter::operator()(FieldAssignment
<Iter
,Interpreter::Value
,FuncType
> &node
)
123 Interpreter::Value table
= node
.children
[0]->accept(*this);
124 if(table
.type() == Interpreter::Value::Type::Table
)
126 Interpreter::Value index
= node
.children
[1]->accept(*this);
127 Interpreter::Value value
= node
.children
[2]->accept(*this);
128 table
.table()->set(index
, value
);
131 else if(table
.type() == Interpreter::Value::Type::Array
)
133 Interpreter::Value index
= node
.children
[1]->accept(*this);
134 if(index
.type() != Interpreter::Value::Type::Number
|| !isint(index
.number()))
136 error("array index not a integer.", node
);
138 int idx
= index
.number();
139 if(idx
<0 || idx
>=int(table
.array()->size()))
141 error("array index out of range.", node
);
143 Interpreter::Value value
= node
.children
[2]->accept(*this);
144 table
.array()->set(index
, value
);
149 error("can only index tables or arrays.", node
);
150 return Interpreter::Value();
154 Interpreter::Value
Interpreter::operator()(AddFieldAssignment
<Iter
,Interpreter::Value
,FuncType
> &node
)
156 Interpreter::Value table
= node
.children
[0]->accept(*this);
157 Interpreter::Value index
, left
, right
;
158 Interpreter::Value::Type t
= table
.type();
159 if(t
== Interpreter::Value::Type::Table
)
161 index
= node
.children
[1]->accept(*this);
162 left
= table
.table()->get(index
);
163 right
= node
.children
[2]->accept(*this);
165 else if(t
== Interpreter::Value::Type::Array
)
167 index
= node
.children
[1]->accept(*this);
168 if(index
.type() != Interpreter::Value::Type::Number
|| !isint(index
.number()))
170 error("array index not a integer.", node
);
172 int idx
= index
.number();
173 if(idx
<0 || idx
>=int(table
.array()->size()))
175 error("array index out of range.", node
);
177 left
= table
.array()->get(index
);
178 right
= node
.children
[2]->accept(*this);
182 error("can only index tables and arrays.", node
);
183 return Interpreter::Value();
185 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
187 left
= Interpreter::Value(left
.number() + right
.number());
189 else if(left
.type() == Interpreter::Value::Type::String
&& right
.type() == Interpreter::Value::Type::String
)
191 left
.string() += right
.string();
193 else if(left
.type() == Interpreter::Value::Type::Table
&& right
.type() == Interpreter::Value::Type::Table
)
195 left
.table()->append(*right
.table());
197 else if(left
.type() == Interpreter::Value::Type::Array
&& right
.type() == Interpreter::Value::Type::Array
)
199 left
.array()->append(*right
.array());
203 error("invalid operands '+='.", node
);
204 return Interpreter::Value();
206 if(t
== Interpreter::Value::Type::Table
)
208 table
.table()->set(index
, left
);
210 else if(t
== Interpreter::Value::Type::Array
)
212 table
.array()->set(index
, left
);
217 Interpreter::Value
Interpreter::operator()(SubFieldAssignment
<Iter
,Interpreter::Value
,FuncType
> &node
)
219 Interpreter::Value table
= node
.children
[0]->accept(*this);
220 Interpreter::Value index
, left
, right
;
221 Interpreter::Value::Type t
= table
.type();
222 if(t
== Interpreter::Value::Type::Table
)
224 index
= node
.children
[1]->accept(*this);
225 left
= table
.table()->get(index
);
226 right
= node
.children
[2]->accept(*this);
228 else if(t
== Interpreter::Value::Type::Array
)
230 index
= node
.children
[1]->accept(*this);
231 if(index
.type() != Interpreter::Value::Type::Number
|| !isint(index
.number()))
233 error("array index not a integer.", node
);
235 int idx
= index
.number();
236 if(idx
<0 || idx
>=int(table
.array()->size()))
238 error("array index out of range.", node
);
240 left
= table
.array()->get(index
);
241 right
= node
.children
[2]->accept(*this);
245 error("can only index tables and arrays.", node
);
246 return Interpreter::Value();
248 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
250 left
= Interpreter::Value(left
.number() - right
.number());
254 error("invalid operands to '-='.", node
);
255 return Interpreter::Value();
257 if(t
== Interpreter::Value::Type::Table
)
259 table
.table()->set(index
, left
);
261 else if(t
== Interpreter::Value::Type::Array
)
263 table
.array()->set(index
, left
);
268 Interpreter::Value
Interpreter::operator()(MulFieldAssignment
<Iter
,Interpreter::Value
,FuncType
> &node
)
270 Interpreter::Value table
= node
.children
[0]->accept(*this);
271 Interpreter::Value index
, left
, right
;
272 Interpreter::Value::Type t
= table
.type();
273 if(t
== Interpreter::Value::Type::Table
)
275 index
= node
.children
[1]->accept(*this);
276 left
= table
.table()->get(index
);
277 right
= node
.children
[2]->accept(*this);
279 else if(t
== Interpreter::Value::Type::Array
)
281 index
= node
.children
[1]->accept(*this);
282 if(index
.type() != Interpreter::Value::Type::Number
|| !isint(index
.number()))
284 error("array index not a integer.", node
);
286 int idx
= index
.number();
287 if(idx
<0 || idx
>=int(table
.array()->size()))
289 error("array index out of range.", node
);
291 left
= table
.array()->get(index
);
292 right
= node
.children
[2]->accept(*this);
296 error("can only index tables and arrays.", node
);
297 return Interpreter::Value();
299 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
301 left
= Interpreter::Value(left
.number() * right
.number());
305 error("invalid operands to '*='.", node
);
306 return Interpreter::Value();
308 if(t
== Interpreter::Value::Type::Table
)
310 table
.table()->set(index
, left
);
312 else if(t
== Interpreter::Value::Type::Array
)
314 table
.array()->set(index
, left
);
319 Interpreter::Value
Interpreter::operator()(DivFieldAssignment
<Iter
,Interpreter::Value
,FuncType
> &node
)
321 Interpreter::Value table
= node
.children
[0]->accept(*this);
322 Interpreter::Value index
, left
, right
;
323 Interpreter::Value::Type t
= table
.type();
324 if(t
== Interpreter::Value::Type::Table
)
326 index
= node
.children
[1]->accept(*this);
327 left
= table
.table()->get(index
);
328 right
= node
.children
[2]->accept(*this);
330 else if(t
== Interpreter::Value::Type::Array
)
332 index
= node
.children
[1]->accept(*this);
333 if(index
.type() != Interpreter::Value::Type::Number
|| !isint(index
.number()))
335 error("array index not a integer.", node
);
337 int idx
= index
.number();
338 if(idx
<0 || idx
>=int(table
.array()->size()))
340 error("array index out of range.", node
);
342 left
= table
.array()->get(index
);
343 right
= node
.children
[2]->accept(*this);
347 error("can only index tables and arrays.", node
);
348 return Interpreter::Value();
350 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
352 left
= Interpreter::Value(left
.number() / right
.number());
356 error("invalid operands to '/='.", node
);
357 return Interpreter::Value();
359 if(t
== Interpreter::Value::Type::Table
)
361 table
.table()->set(index
, left
);
363 else if(t
== Interpreter::Value::Type::Array
)
365 table
.array()->set(index
, left
);
370 Interpreter::Value
Interpreter::operator()(ModFieldAssignment
<Iter
,Interpreter::Value
,FuncType
> &node
)
372 Interpreter::Value table
= node
.children
[0]->accept(*this);
373 Interpreter::Value index
, left
, right
;
374 Interpreter::Value::Type t
= table
.type();
375 if(t
== Interpreter::Value::Type::Table
)
377 index
= node
.children
[1]->accept(*this);
378 left
= table
.table()->get(index
);
379 right
= node
.children
[2]->accept(*this);
381 else if(t
== Interpreter::Value::Type::Array
)
383 index
= node
.children
[1]->accept(*this);
384 if(index
.type() != Interpreter::Value::Type::Number
|| !isint(index
.number()))
386 error("array index not a integer.", node
);
388 int idx
= index
.number();
389 if(idx
<0 || idx
>=int(table
.array()->size()))
391 error("array index out of range.", node
);
393 left
= table
.array()->get(index
);
394 right
= node
.children
[2]->accept(*this);
398 error("can only index tables and arrays.", node
);
399 return Interpreter::Value();
401 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
403 left
= Interpreter::Value(std::fmod(left
.number(), right
.number()));
407 error("invalid operands to '%='.", node
);
408 return Interpreter::Value();
410 if(t
== Interpreter::Value::Type::Table
)
412 table
.table()->set(index
, left
);
414 else if(t
== Interpreter::Value::Type::Array
)
416 table
.array()->set(index
, left
);
421 Interpreter::Value
Interpreter::operator()(UnaryPlusExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
423 Interpreter::Value operand
= node
.children
[0]->accept(*this);
424 if(operand
.type() != Interpreter::Value::Type::Number
)
426 error("invalid operand to '+'.", node
);
431 Interpreter::Value
Interpreter::operator()(UnaryMinusExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
433 Interpreter::Value operand
= node
.children
[0]->accept(*this);
434 if(operand
.type() != Interpreter::Value::Type::Number
)
436 error("invalid operand to '-'.", node
);
438 return Interpreter::Value(-operand
.number());
441 Interpreter::Value
Interpreter::operator()(UnaryNotExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
443 Interpreter::Value operand
= node
.children
[0]->accept(*this);
444 if(operand
.type() != Interpreter::Value::Type::Number
)
446 error("invalid operand to '!'.", node
);
448 return Interpreter::Value(operand
.number()==0.0?1.0:0.0);
451 Interpreter::Value
Interpreter::operator()(MultiplyExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
453 Interpreter::Value left
= node
.children
[0]->accept(*this);
454 Interpreter::Value right
= node
.children
[1]->accept(*this);
455 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
457 return Interpreter::Value(left
.number() * right
.number());
461 error("invalid operands to '*'.", node
);
462 return Interpreter::Value();
466 Interpreter::Value
Interpreter::operator()(DivideExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
468 Interpreter::Value left
= node
.children
[0]->accept(*this);
469 Interpreter::Value right
= node
.children
[1]->accept(*this);
470 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
472 return Interpreter::Value(left
.number() / right
.number());
476 error("invalid operands to '/'.", node
);
477 return Interpreter::Value();
481 Interpreter::Value
Interpreter::operator()(ModuloExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
483 Interpreter::Value left
= node
.children
[0]->accept(*this);
484 Interpreter::Value right
= node
.children
[1]->accept(*this);
485 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
487 return Interpreter::Value(std::fmod(left
.number(), right
.number()));
491 error("invalid operands to '%'.", node
);
492 return Interpreter::Value();
496 Interpreter::Value
Interpreter::operator()(AddExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
498 Interpreter::Value left
= node
.children
[0]->accept(*this);
499 Interpreter::Value right
= node
.children
[1]->accept(*this);
500 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
502 return Interpreter::Value(left
.number() + right
.number());
504 else if(left
.type() == Interpreter::Value::Type::String
&& right
.type() == Interpreter::Value::Type::String
)
506 return Interpreter::Value(left
.string() + right
.string());
508 else if(left
.type() == Interpreter::Value::Type::Table
&& right
.type() == Interpreter::Value::Type::Table
)
510 typename
Interpreter::Value::TableContainer
table(new Table
<Interpreter::Value
>);
511 table
->append(*left
.table());
512 table
->append(*right
.table());
513 return Interpreter::Value(table
);
515 else if(left
.type() == Interpreter::Value::Type::Array
&& right
.type() == Interpreter::Value::Type::Array
)
517 typename
Interpreter::Value::ArrayContainer
array(new Array
<Interpreter::Value
>);
518 array
->append(*left
.array());
519 array
->append(*right
.array());
520 return Interpreter::Value(array
);
524 error("invalid operands to '+'.", node
);
525 return Interpreter::Value();
529 Interpreter::Value
Interpreter::operator()(SubtractExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
531 Interpreter::Value left
= node
.children
[0]->accept(*this);
532 Interpreter::Value right
= node
.children
[1]->accept(*this);
533 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
535 return Interpreter::Value(left
.number() - right
.number());
539 error("invalid operands to '-'.", node
);
540 return Interpreter::Value();
544 Interpreter::Value
Interpreter::operator()(LessExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
546 Interpreter::Value left
= node
.children
[0]->accept(*this);
547 Interpreter::Value right
= node
.children
[1]->accept(*this);
548 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
550 return Interpreter::Value(left
.number() < right
.number());
552 else if(left
.type() == Interpreter::Value::Type::String
&& right
.type() == Interpreter::Value::Type::String
)
554 return Interpreter::Value(left
.string() < right
.string());
558 error("invalid operands to '<'.", node
);
559 return Interpreter::Value();
563 Interpreter::Value
Interpreter::operator()(LessEqualExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
565 Interpreter::Value left
= node
.children
[0]->accept(*this);
566 Interpreter::Value right
= node
.children
[1]->accept(*this);
567 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
569 return Interpreter::Value(left
.number() <= right
.number());
571 else if(left
.type() == Interpreter::Value::Type::String
&& right
.type() == Interpreter::Value::Type::String
)
573 return Interpreter::Value(left
.string() <= right
.string());
577 error("invalid operands to '<='.", node
);
578 return Interpreter::Value();
582 Interpreter::Value
Interpreter::operator()(GreaterExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
584 Interpreter::Value left
= node
.children
[0]->accept(*this);
585 Interpreter::Value right
= node
.children
[1]->accept(*this);
586 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
588 return Interpreter::Value(left
.number() > right
.number());
590 else if(left
.type() == Interpreter::Value::Type::String
&& right
.type() == Interpreter::Value::Type::String
)
592 return Interpreter::Value(left
.string() > right
.string());
596 error("invalid operands to '>'.", node
);
597 return Interpreter::Value();
601 Interpreter::Value
Interpreter::operator()(GreaterEqualExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
603 Interpreter::Value left
= node
.children
[0]->accept(*this);
604 Interpreter::Value right
= node
.children
[1]->accept(*this);
605 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
607 return Interpreter::Value(left
.number() >= right
.number());
609 else if(left
.type() == Interpreter::Value::Type::String
&& right
.type() == Interpreter::Value::Type::String
)
611 return Interpreter::Value(left
.string() >= right
.string());
615 error("invalid operands to '>='.", node
);
616 return Interpreter::Value();
620 Interpreter::Value
Interpreter::operator()(EqualExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
622 Interpreter::Value left
= node
.children
[0]->accept(*this);
623 Interpreter::Value right
= node
.children
[1]->accept(*this);
624 return Interpreter::Value(left
== right
);
627 Interpreter::Value
Interpreter::operator()(NotEqualExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
629 Interpreter::Value left
= node
.children
[0]->accept(*this);
630 Interpreter::Value right
= node
.children
[1]->accept(*this);
631 return Interpreter::Value(!(left
== right
));
634 Interpreter::Value
Interpreter::operator()(LogicalAndExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
636 Interpreter::Value left
= node
.children
[0]->accept(*this);
637 if(left
.type() == Interpreter::Value::Type::Number
)
639 if(left
.number() != 0.0)
641 Interpreter::Value right
= node
.children
[1]->accept(*this);
642 if(right
.type() == Interpreter::Value::Type::Number
)
644 return Interpreter::Value(right
.number() != 0.0);
648 error("invalid operands to '&&'.", node
);
649 return Interpreter::Value();
654 return Interpreter::Value(0.0);
659 error("invalid operands to '&&'.", node
);
660 return Interpreter::Value();
664 Interpreter::Value
Interpreter::operator()(LogicalOrExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
666 Interpreter::Value left
= node
.children
[0]->accept(*this);
667 if(left
.type() == Interpreter::Value::Type::Number
)
669 if(left
.number() == 0.0)
671 Interpreter::Value right
= node
.children
[1]->accept(*this);
672 if(right
.type() == Interpreter::Value::Type::Number
)
674 return Interpreter::Value(right
.number() != 0.0);
678 error("invalid operands to '||'.", node
);
679 return Interpreter::Value();
684 return Interpreter::Value(1.0);
689 error("invalid operands to '||'.", node
);
690 return Interpreter::Value();
694 Interpreter::Value
Interpreter::operator()(AssignmentExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
696 Interpreter::Value left
= node
.children
[0]->accept(*this);
697 Interpreter::Value right
= node
.children
[1]->accept(*this);
702 Interpreter::Value
Interpreter::operator()(GlobalAssignmentExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
704 Interpreter::Value left
= node
.children
[0]->accept(*this);
705 Interpreter::Value right
= node
.children
[1]->accept(*this);
706 setGlobal(left
, right
);
710 Interpreter::Value
Interpreter::operator()(LocalAssignmentExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
712 Interpreter::Value left
= node
.children
[0]->accept(*this);
713 Interpreter::Value right
= node
.children
[1]->accept(*this);
714 setLocal(left
, right
);
718 Interpreter::Value
Interpreter::operator()(AddAssignmentExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
720 Interpreter::Value name
= node
.children
[0]->accept(*this);
721 Interpreter::Value left
= get(name
);
722 Interpreter::Value right
= node
.children
[1]->accept(*this);
723 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
725 left
= Interpreter::Value(left
.number() + right
.number());
727 else if(left
.type() == Interpreter::Value::Type::String
&& right
.type() == Interpreter::Value::Type::String
)
729 left
.string() += right
.string();
731 else if(left
.type() == Interpreter::Value::Type::Table
&& right
.type() == Interpreter::Value::Type::Table
)
733 left
.table()->append(*right
.table());
735 else if(left
.type() == Interpreter::Value::Type::Array
&& right
.type() == Interpreter::Value::Type::Array
)
737 left
.array()->append(*right
.array());
741 error("invalid operands to '+='.", node
);
742 return Interpreter::Value();
748 Interpreter::Value
Interpreter::operator()(SubAssignmentExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
750 Interpreter::Value name
= node
.children
[0]->accept(*this);
751 Interpreter::Value left
= get(name
);
752 Interpreter::Value right
= node
.children
[1]->accept(*this);
753 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
755 left
= Interpreter::Value(left
.number() - right
.number());
759 error("invalid operands to '-='.", node
);
760 return Interpreter::Value();
766 Interpreter::Value
Interpreter::operator()(MulAssignmentExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
768 Interpreter::Value name
= node
.children
[0]->accept(*this);
769 Interpreter::Value left
= get(name
);
770 Interpreter::Value right
= node
.children
[1]->accept(*this);
771 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
773 left
= Interpreter::Value(left
.number() * right
.number());
777 error("invalid operands to '*='.", node
);
778 return Interpreter::Value();
784 Interpreter::Value
Interpreter::operator()(DivAssignmentExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
786 Interpreter::Value name
= node
.children
[0]->accept(*this);
787 Interpreter::Value left
= get(name
);
788 Interpreter::Value right
= node
.children
[1]->accept(*this);
789 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
791 left
= Interpreter::Value(left
.number() / right
.number());
795 error("invalid operands to '/='.", node
);
796 return Interpreter::Value();
802 Interpreter::Value
Interpreter::operator()(ModAssignmentExpression
<Iter
,Interpreter::Value
,FuncType
> &node
)
804 Interpreter::Value name
= node
.children
[0]->accept(*this);
805 Interpreter::Value left
= get(name
);
806 Interpreter::Value right
= node
.children
[1]->accept(*this);
807 if(left
.type() == Interpreter::Value::Type::Number
&& right
.type() == Interpreter::Value::Type::Number
)
809 left
= Interpreter::Value(std::fmod(left
.number(), right
.number()));
813 error("invalid operands to '%='.", node
);
814 return Interpreter::Value();
820 Interpreter::Value
Interpreter::operator()(Block
<Iter
,Interpreter::Value
,FuncType
> &node
)
822 LocalScope
localscope(*this);
823 return node
.children
[0]->accept(*this);
826 Interpreter::Value
Interpreter::operator()(TableInitializer
<Iter
,Interpreter::Value
,FuncType
> &node
)
828 Interpreter::Value::NumberType current
= 0;
829 typename
Interpreter::Value::TableContainer
table(new Table
<Interpreter::Value
>);
830 for(auto tmpchild
: node
.children
)
832 auto child
= static_cast<InitializerAssignmentExpression
<Iter
,Interpreter::Value
,FuncType
>*>(tmpchild
.get());
833 if(child
->children
.size() == 1)
835 table
->set(Interpreter::Value(current
++), child
->children
[0]->accept(*this));
839 Interpreter::Value index
= child
->children
[0]->accept(*this);
840 if(index
.type() == Interpreter::Value::Type::Number
&& isint(index
.number()))
842 current
= index
.number()+1;
844 table
->set(index
, child
->children
[1]->accept(*this));
847 return Interpreter::Value(table
);
850 Interpreter::Value
Interpreter::operator()(ArrayInitializer
<Iter
,Interpreter::Value
,FuncType
> &node
)
852 typename
Interpreter::Value::ArrayContainer
array(new Array
<Interpreter::Value
>);
853 for(auto& tmpchild
: node
.children
)
855 array
->add(tmpchild
->accept(*this));
857 return Interpreter::Value(array
);
860 Interpreter::Value
Interpreter::operator()(Function
<Iter
,Interpreter::Value
,FuncType
> &node
)
862 return Interpreter::Value(Interpreter::Value::Type::Function
, node
.shared_from_this());
865 Interpreter::Value
Interpreter::operator()(IdentifierList
<Iter
,Interpreter::Value
,FuncType
> &node
)
867 auto i
= m_function_stack
.begin();
868 auto end
= m_function_stack
.end();
869 set(Interpreter::Value("this"), *i
++);
870 for(auto child
: node
.children
)
876 set(child
->accept(*this), *i
++);
878 m_function_stack
.clear();
879 return Interpreter::Value();
882 Interpreter::Value
Interpreter::operator()(BuiltinFunction
<Iter
,Interpreter::Value
,FuncType
> &node
)
884 node
.function(*this, m_function_stack
);
885 return Interpreter::Value();
888 Interpreter::Value
Interpreter::operator()(Call
<Iter
,Interpreter::Value
,FuncType
> &node
)
890 Interpreter::Value fun
= node
.children
[0]->accept(*this);
891 if(fun
.type() != Interpreter::Value::Type::Function
)
893 error("can not call non-function", node
);
894 return Interpreter::Value();
896 auto function
= fun
.function();
897 std::vector
<Interpreter::Value
> args
;
898 for(size_t i
= 1; i
<node
.children
.size(); ++i
)
900 args
.push_back(node
.children
[i
]->accept(*this));
902 m_function_stack
.push_back(Interpreter::Value());
903 for(size_t i
= 1; i
<node
.children
.size(); ++i
)
905 m_function_stack
.push_back(args
[i
-1]);
907 FunctionScope
functionscope(this);
908 function
->children
[0]->accept(*this);
909 function
->children
[1]->accept(*this);
910 if(!m_function_stack
.empty())
912 Interpreter::Value result
= m_function_stack
.back();
913 m_function_stack
.clear();
918 return Interpreter::Value();
923 Interpreter::Value
Interpreter::operator()(Tree
<Iter
,Interpreter::Value
,FuncType
> &node
)
925 return Interpreter::Value(Interpreter::Value::Type::Tree
, node
.children
[0]);
928 Interpreter::Value
Interpreter::operator()(Root
<Iter
,Interpreter::Value
,FuncType
> &node
)
930 if(node
.children
.empty())
932 return Interpreter::Value(Interpreter::Value::Type::Tree
, node
.root
.lock());
936 Interpreter::Value tree
= node
.children
[0]->accept(*this);
937 if(tree
.type() == Interpreter::Value::Type::Tree
|| tree
.type() == Interpreter::Value::Type::Function
)
939 return Interpreter::Value(Interpreter::Value::Type::Tree
, tree
.pointer()->root
.lock());
943 error("cannot find root of non-tree.", node
);
944 return Interpreter::Value();