added '$args' variable that is added to each function scope - thus allowing variadic...
[aqualang.git] / src / ops.cpp
blob591f6e9e51b8d29973a2d9c5ff19efd7411a41e0
2 #include "private.h"
4 using namespace Internal;
6 Interpreter::Value Interpreter::operator()(Variable<Iter,Interpreter::Value,FuncType> &node)
8 return get(node.name);
11 Interpreter::Value Interpreter::operator()(FieldName<Iter,Interpreter::Value,FuncType> &node)
13 return node.name;
16 Interpreter::Value Interpreter::operator()(Constant<Iter,Interpreter::Value,FuncType> &node)
18 return node.value;
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)
33 return node.value;
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;
45 expr = node.children[0]->accept(*this);
46 switch(expr.type())
48 case Interpreter::Value::Type::String:
49 return Interpreter::Value(std::string("string"));
50 case Interpreter::Value::Type::Number:
51 return Interpreter::Value(std::string("number"));
52 case Interpreter::Value::Type::Tree:
53 return Interpreter::Value(std::string("tree"));
54 case Interpreter::Value::Type::Function:
55 return Interpreter::Value(std::string("function"));
56 case Interpreter::Value::Type::Table:
57 return Interpreter::Value(std::string("table"));
58 case Interpreter::Value::Type::Array:
59 return Interpreter::Value(std::string("array"));
60 case Interpreter::Value::Type::Nil:
61 return Interpreter::Value(std::string("nil"));
62 default:
63 error("unknown type", node);
64 return Interpreter::Value();
68 Interpreter::Value Interpreter::operator()(Size<Iter,Interpreter::Value,FuncType> &node)
70 Interpreter::Value expr;
71 expr = node.children[0]->accept(*this);
72 switch(expr.type())
74 case Interpreter::Value::Type::String:
75 return Interpreter::Value(expr.string().size());
76 case Interpreter::Value::Type::Number:
77 return Interpreter::Value(1);
78 case Interpreter::Value::Type::Tree:
79 return Interpreter::Value(expr.pointer()->size());
80 case Interpreter::Value::Type::Function:
81 return Interpreter::Value(expr.pointer()->size());
82 case Interpreter::Value::Type::Table:
83 return Interpreter::Value(expr.table()->size());
84 case Interpreter::Value::Type::Array:
85 return Interpreter::Value(expr.array()->size());
86 case Interpreter::Value::Type::Nil:
87 return Interpreter::Value(0.0);
88 default:
89 error("unknown type", node);
90 return Interpreter::Value();
94 Interpreter::Value Interpreter::operator()(FieldAccess<Iter,Interpreter::Value,FuncType> &node)
96 int idx;
97 Interpreter::Value left;
98 Interpreter::Value right;
99 left = node.children[0]->accept(*this);
100 if(left.type() == Interpreter::Value::Type::Table)
102 right = node.children[1]->accept(*this);
103 return left.table()->get(right);
105 else if(left.type() == Interpreter::Value::Type::Array)
107 right = node.children[1]->accept(*this);
108 if(right.type() != Interpreter::Value::Type::Number || !isint(right.number()))
110 error("array index not a integer", node);
112 idx = right.number();
113 if(idx<0 || idx>=int(left.array()->size()))
115 error("array index out of range", node);
117 return left.array()->get(right);
119 else if(left.type() == Interpreter::Value::Type::String)
121 auto selfstr = left.string();
122 right = node.children[1]->accept(*this);
123 if(right.type() != Interpreter::Value::Type::Number || !isint(right.number()))
125 error("string index not an integer", node);
127 idx = right.number();
128 if((idx < 0) || (idx >= int(selfstr.size())))
130 error("string index out of range", node);
132 return Value(Value::NumberType(selfstr.at(idx)));
134 else
136 error("can only index tables or arrays", node);
137 return Interpreter::Value();
141 Interpreter::Value Interpreter::operator()(FieldAssignment<Iter,Interpreter::Value,FuncType> &node)
143 Interpreter::Value table;
144 table = node.children[0]->accept(*this);
145 if(table.type() == Interpreter::Value::Type::Table)
147 Interpreter::Value index = node.children[1]->accept(*this);
148 Interpreter::Value value = node.children[2]->accept(*this);
149 table.table()->set(index, value);
150 return value;
152 else if(table.type() == Interpreter::Value::Type::Array)
154 Interpreter::Value index = node.children[1]->accept(*this);
155 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
157 error("array index not a integer.", node);
159 int idx = index.number();
160 if(idx<0 || idx>=int(table.array()->size()))
162 error("array index out of range.", node);
164 Interpreter::Value value = node.children[2]->accept(*this);
165 table.array()->set(index, value);
166 return value;
168 else
170 error("can only index tables or arrays.", node);
171 return Interpreter::Value();
175 Interpreter::Value Interpreter::operator()(AddFieldAssignment<Iter,Interpreter::Value,FuncType> &node)
177 Interpreter::Value table;
178 Interpreter::Value index, left, right;
179 Interpreter::Value::Type t;
180 table = node.children[0]->accept(*this);
181 t = table.type();
182 if(t == Interpreter::Value::Type::Table)
184 index = node.children[1]->accept(*this);
185 left = table.table()->get(index);
186 right = node.children[2]->accept(*this);
188 else if(t == Interpreter::Value::Type::Array)
190 index = node.children[1]->accept(*this);
191 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
193 error("array index not a integer.", node);
195 int idx = index.number();
196 if(idx<0 || idx>=int(table.array()->size()))
198 error("array index out of range.", node);
200 left = table.array()->get(index);
201 right = node.children[2]->accept(*this);
203 else
205 error("can only index tables and arrays.", node);
206 return Interpreter::Value();
208 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
210 left = Interpreter::Value(left.number() + right.number());
212 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
214 left.string() += right.string();
216 else if(left.type() == Interpreter::Value::Type::Table && right.type() == Interpreter::Value::Type::Table)
218 left.table()->append(*right.table());
220 else if(left.type() == Interpreter::Value::Type::Array && right.type() == Interpreter::Value::Type::Array)
222 left.array()->append(*right.array());
224 else
226 error("invalid operands '+='.", node);
227 return Interpreter::Value();
229 if(t == Interpreter::Value::Type::Table)
231 table.table()->set(index, left);
233 else if(t == Interpreter::Value::Type::Array)
235 table.array()->set(index, left);
237 return left;
240 Interpreter::Value Interpreter::operator()(SubFieldAssignment<Iter,Interpreter::Value,FuncType> &node)
242 Interpreter::Value table = node.children[0]->accept(*this);
243 Interpreter::Value index, left, right;
244 Interpreter::Value::Type t = table.type();
245 if(t == Interpreter::Value::Type::Table)
247 index = node.children[1]->accept(*this);
248 left = table.table()->get(index);
249 right = node.children[2]->accept(*this);
251 else if(t == Interpreter::Value::Type::Array)
253 index = node.children[1]->accept(*this);
254 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
256 error("array index not a integer.", node);
258 int idx = index.number();
259 if(idx<0 || idx>=int(table.array()->size()))
261 error("array index out of range.", node);
263 left = table.array()->get(index);
264 right = node.children[2]->accept(*this);
266 else
268 error("can only index tables and arrays.", node);
269 return Interpreter::Value();
271 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
273 left = Interpreter::Value(left.number() - right.number());
275 else
277 error("invalid operands to '-='.", node);
278 return Interpreter::Value();
280 if(t == Interpreter::Value::Type::Table)
282 table.table()->set(index, left);
284 else if(t == Interpreter::Value::Type::Array)
286 table.array()->set(index, left);
288 return left;
291 Interpreter::Value Interpreter::operator()(MulFieldAssignment<Iter,Interpreter::Value,FuncType> &node)
293 Interpreter::Value table = node.children[0]->accept(*this);
294 Interpreter::Value index, left, right;
295 Interpreter::Value::Type t = table.type();
296 if(t == Interpreter::Value::Type::Table)
298 index = node.children[1]->accept(*this);
299 left = table.table()->get(index);
300 right = node.children[2]->accept(*this);
302 else if(t == Interpreter::Value::Type::Array)
304 index = node.children[1]->accept(*this);
305 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
307 error("array index not a integer.", node);
309 int idx = index.number();
310 if(idx<0 || idx>=int(table.array()->size()))
312 error("array index out of range.", node);
314 left = table.array()->get(index);
315 right = node.children[2]->accept(*this);
317 else
319 error("can only index tables and arrays.", node);
320 return Interpreter::Value();
322 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
324 left = Interpreter::Value(left.number() * right.number());
326 else
328 error("invalid operands to '*='.", node);
329 return Interpreter::Value();
331 if(t == Interpreter::Value::Type::Table)
333 table.table()->set(index, left);
335 else if(t == Interpreter::Value::Type::Array)
337 table.array()->set(index, left);
339 return left;
342 Interpreter::Value Interpreter::operator()(DivFieldAssignment<Iter,Interpreter::Value,FuncType> &node)
344 Interpreter::Value table = node.children[0]->accept(*this);
345 Interpreter::Value index, left, right;
346 Interpreter::Value::Type t = table.type();
347 if(t == Interpreter::Value::Type::Table)
349 index = node.children[1]->accept(*this);
350 left = table.table()->get(index);
351 right = node.children[2]->accept(*this);
353 else if(t == Interpreter::Value::Type::Array)
355 index = node.children[1]->accept(*this);
356 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
358 error("array index not a integer.", node);
360 int idx = index.number();
361 if(idx<0 || idx>=int(table.array()->size()))
363 error("array index out of range.", node);
365 left = table.array()->get(index);
366 right = node.children[2]->accept(*this);
368 else
370 error("can only index tables and arrays.", node);
371 return Interpreter::Value();
373 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
375 left = Interpreter::Value(left.number() / right.number());
377 else
379 error("invalid operands to '/='.", node);
380 return Interpreter::Value();
382 if(t == Interpreter::Value::Type::Table)
384 table.table()->set(index, left);
386 else if(t == Interpreter::Value::Type::Array)
388 table.array()->set(index, left);
390 return left;
393 Interpreter::Value Interpreter::operator()(ModFieldAssignment<Iter,Interpreter::Value,FuncType> &node)
395 Interpreter::Value table = node.children[0]->accept(*this);
396 Interpreter::Value index, left, right;
397 Interpreter::Value::Type t = table.type();
398 if(t == Interpreter::Value::Type::Table)
400 index = node.children[1]->accept(*this);
401 left = table.table()->get(index);
402 right = node.children[2]->accept(*this);
404 else if(t == Interpreter::Value::Type::Array)
406 index = node.children[1]->accept(*this);
407 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
409 error("array index not a integer.", node);
411 int idx = index.number();
412 if(idx<0 || idx>=int(table.array()->size()))
414 error("array index out of range.", node);
416 left = table.array()->get(index);
417 right = node.children[2]->accept(*this);
419 else
421 error("can only index tables and arrays.", node);
422 return Interpreter::Value();
424 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
426 left = Interpreter::Value(std::fmod(left.number(), right.number()));
428 else
430 error("invalid operands to '%='.", node);
431 return Interpreter::Value();
433 if(t == Interpreter::Value::Type::Table)
435 table.table()->set(index, left);
437 else if(t == Interpreter::Value::Type::Array)
439 table.array()->set(index, left);
441 return left;
444 Interpreter::Value Interpreter::operator()(UnaryPlusExpression<Iter,Interpreter::Value,FuncType> &node)
446 Interpreter::Value operand = node.children[0]->accept(*this);
447 if(operand.type() != Interpreter::Value::Type::Number)
449 error("invalid operand to '+'.", node);
451 return operand;
454 Interpreter::Value Interpreter::operator()(UnaryMinusExpression<Iter,Interpreter::Value,FuncType> &node)
456 Interpreter::Value operand = node.children[0]->accept(*this);
457 if(operand.type() != Interpreter::Value::Type::Number)
459 error("invalid operand to '-'.", node);
461 return Interpreter::Value(-operand.number());
464 Interpreter::Value Interpreter::operator()(UnaryNotExpression<Iter,Interpreter::Value,FuncType> &node)
466 Interpreter::Value operand = node.children[0]->accept(*this);
467 if(operand.type() != Interpreter::Value::Type::Number)
469 error("invalid operand to '!'.", node);
471 return Interpreter::Value(operand.number()==0.0?1.0:0.0);
474 Interpreter::Value Interpreter::operator()(MultiplyExpression<Iter,Interpreter::Value,FuncType> &node)
476 Interpreter::Value left = node.children[0]->accept(*this);
477 Interpreter::Value right = node.children[1]->accept(*this);
478 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
480 return Interpreter::Value(left.number() * right.number());
482 else
484 error("invalid operands to '*'.", node);
485 return Interpreter::Value();
489 Interpreter::Value Interpreter::operator()(DivideExpression<Iter,Interpreter::Value,FuncType> &node)
491 Interpreter::Value left = node.children[0]->accept(*this);
492 Interpreter::Value right = node.children[1]->accept(*this);
493 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
495 return Interpreter::Value(left.number() / right.number());
497 else
499 error("invalid operands to '/'.", node);
500 return Interpreter::Value();
504 Interpreter::Value Interpreter::operator()(ModuloExpression<Iter,Interpreter::Value,FuncType> &node)
506 Interpreter::Value left = node.children[0]->accept(*this);
507 Interpreter::Value right = node.children[1]->accept(*this);
508 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
510 return Interpreter::Value(std::fmod(left.number(), right.number()));
512 else
514 error("invalid operands to '%'.", node);
515 return Interpreter::Value();
519 Interpreter::Value Interpreter::operator()(AddExpression<Iter,Interpreter::Value,FuncType> &node)
521 Interpreter::Value left = node.children[0]->accept(*this);
522 Interpreter::Value right = node.children[1]->accept(*this);
523 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
525 return Interpreter::Value(left.number() + right.number());
527 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
529 return Interpreter::Value(left.string() + right.string());
531 else if(left.type() == Interpreter::Value::Type::Table && right.type() == Interpreter::Value::Type::Table)
533 typename Interpreter::Value::TableContainer table(new Table<Interpreter::Value>);
534 table->append(*left.table());
535 table->append(*right.table());
536 return Interpreter::Value(table);
538 else if(left.type() == Interpreter::Value::Type::Array && right.type() == Interpreter::Value::Type::Array)
540 typename Interpreter::Value::ArrayContainer array(new Array<Interpreter::Value>);
541 array->append(*left.array());
542 array->append(*right.array());
543 return Interpreter::Value(array);
545 else
547 error("invalid operands to '+'.", node);
548 return Interpreter::Value();
552 Interpreter::Value Interpreter::operator()(SubtractExpression<Iter,Interpreter::Value,FuncType> &node)
554 Interpreter::Value left = node.children[0]->accept(*this);
555 Interpreter::Value right = node.children[1]->accept(*this);
556 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
558 return Interpreter::Value(left.number() - right.number());
560 else
562 error("invalid operands to '-'.", node);
563 return Interpreter::Value();
567 Interpreter::Value Interpreter::operator()(LessExpression<Iter,Interpreter::Value,FuncType> &node)
569 Interpreter::Value left = node.children[0]->accept(*this);
570 Interpreter::Value right = node.children[1]->accept(*this);
571 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
573 return Interpreter::Value(left.number() < right.number());
575 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
577 return Interpreter::Value(left.string() < right.string());
579 else
581 error("invalid operands to '<'.", node);
582 return Interpreter::Value();
586 Interpreter::Value Interpreter::operator()(LessEqualExpression<Iter,Interpreter::Value,FuncType> &node)
588 Interpreter::Value left = node.children[0]->accept(*this);
589 Interpreter::Value right = node.children[1]->accept(*this);
590 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
592 return Interpreter::Value(left.number() <= right.number());
594 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
596 return Interpreter::Value(left.string() <= right.string());
598 else
600 error("invalid operands to '<='.", node);
601 return Interpreter::Value();
605 Interpreter::Value Interpreter::operator()(GreaterExpression<Iter,Interpreter::Value,FuncType> &node)
607 Interpreter::Value left = node.children[0]->accept(*this);
608 Interpreter::Value right = node.children[1]->accept(*this);
609 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
611 return Interpreter::Value(left.number() > right.number());
613 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
615 return Interpreter::Value(left.string() > right.string());
617 else
619 error("invalid operands to '>'.", node);
620 return Interpreter::Value();
624 Interpreter::Value Interpreter::operator()(GreaterEqualExpression<Iter,Interpreter::Value,FuncType> &node)
626 Interpreter::Value left = node.children[0]->accept(*this);
627 Interpreter::Value right = node.children[1]->accept(*this);
628 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
630 return Interpreter::Value(left.number() >= right.number());
632 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
634 return Interpreter::Value(left.string() >= right.string());
636 else
638 error("invalid operands to '>='.", node);
639 return Interpreter::Value();
643 Interpreter::Value Interpreter::operator()(EqualExpression<Iter,Interpreter::Value,FuncType> &node)
645 Interpreter::Value left = node.children[0]->accept(*this);
646 Interpreter::Value right = node.children[1]->accept(*this);
647 return Interpreter::Value(left == right);
650 Interpreter::Value Interpreter::operator()(NotEqualExpression<Iter,Interpreter::Value,FuncType> &node)
652 Interpreter::Value left = node.children[0]->accept(*this);
653 Interpreter::Value right = node.children[1]->accept(*this);
654 return Interpreter::Value(!(left == right));
657 Interpreter::Value Interpreter::operator()(LogicalAndExpression<Iter,Interpreter::Value,FuncType> &node)
659 Interpreter::Value left = node.children[0]->accept(*this);
660 if(left.type() == Interpreter::Value::Type::Number)
662 if(left.number() != 0.0)
664 Interpreter::Value right = node.children[1]->accept(*this);
665 if(right.type() == Interpreter::Value::Type::Number)
667 return Interpreter::Value(right.number() != 0.0);
669 else
671 error("invalid operands to '&&'.", node);
672 return Interpreter::Value();
675 else
677 return Interpreter::Value(0.0);
680 else
682 error("invalid operands to '&&'.", node);
683 return Interpreter::Value();
687 Interpreter::Value Interpreter::operator()(LogicalOrExpression<Iter,Interpreter::Value,FuncType> &node)
689 Interpreter::Value left = node.children[0]->accept(*this);
690 if(left.type() == Interpreter::Value::Type::Number)
692 if(left.number() == 0.0)
694 Interpreter::Value right = node.children[1]->accept(*this);
695 if(right.type() == Interpreter::Value::Type::Number)
697 return Interpreter::Value(right.number() != 0.0);
699 else
701 error("invalid operands to '||'.", node);
702 return Interpreter::Value();
705 else
707 return Interpreter::Value(1.0);
710 else
712 error("invalid operands to '||'.", node);
713 return Interpreter::Value();
717 Interpreter::Value Interpreter::operator()(AssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
719 Interpreter::Value left = node.children[0]->accept(*this);
720 Interpreter::Value right = node.children[1]->accept(*this);
721 set(left, right);
722 return right;
725 Interpreter::Value Interpreter::operator()(GlobalAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
727 Interpreter::Value left = node.children[0]->accept(*this);
728 Interpreter::Value right = node.children[1]->accept(*this);
729 setGlobal(left, right);
730 return right;
733 Interpreter::Value Interpreter::operator()(LocalAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
735 Interpreter::Value left = node.children[0]->accept(*this);
736 Interpreter::Value right = node.children[1]->accept(*this);
737 setLocal(left, right);
738 return right;
741 Interpreter::Value Interpreter::operator()(AddAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
743 Interpreter::Value name = node.children[0]->accept(*this);
744 Interpreter::Value left = get(name);
745 Interpreter::Value right = node.children[1]->accept(*this);
746 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
748 left = Interpreter::Value(left.number() + right.number());
750 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
752 left.string() += right.string();
754 else if(left.type() == Interpreter::Value::Type::Table && right.type() == Interpreter::Value::Type::Table)
756 left.table()->append(*right.table());
758 else if(left.type() == Interpreter::Value::Type::Array && right.type() == Interpreter::Value::Type::Array)
760 left.array()->append(*right.array());
762 else
764 error("invalid operands to '+='.", node);
765 return Interpreter::Value();
767 set(name, left);
768 return left;
771 Interpreter::Value Interpreter::operator()(SubAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
773 Interpreter::Value name = node.children[0]->accept(*this);
774 Interpreter::Value left = get(name);
775 Interpreter::Value right = node.children[1]->accept(*this);
776 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
778 left = Interpreter::Value(left.number() - right.number());
780 else
782 error("invalid operands to '-='.", node);
783 return Interpreter::Value();
785 set(name, left);
786 return left;
789 Interpreter::Value Interpreter::operator()(MulAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
791 Interpreter::Value name = node.children[0]->accept(*this);
792 Interpreter::Value left = get(name);
793 Interpreter::Value right = node.children[1]->accept(*this);
794 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
796 left = Interpreter::Value(left.number() * right.number());
798 else
800 error("invalid operands to '*='.", node);
801 return Interpreter::Value();
803 set(name, left);
804 return left;
807 Interpreter::Value Interpreter::operator()(DivAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
809 Interpreter::Value name = node.children[0]->accept(*this);
810 Interpreter::Value left = get(name);
811 Interpreter::Value right = node.children[1]->accept(*this);
812 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
814 left = Interpreter::Value(left.number() / right.number());
816 else
818 error("invalid operands to '/='.", node);
819 return Interpreter::Value();
821 set(name, left);
822 return left;
825 Interpreter::Value Interpreter::operator()(ModAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
827 Interpreter::Value name = node.children[0]->accept(*this);
828 Interpreter::Value left = get(name);
829 Interpreter::Value right = node.children[1]->accept(*this);
830 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
832 left = Interpreter::Value(std::fmod(left.number(), right.number()));
834 else
836 error("invalid operands to '%='.", node);
837 return Interpreter::Value();
839 set(name, left);
840 return left;
843 Interpreter::Value Interpreter::operator()(Block<Iter,Interpreter::Value,FuncType> &node)
845 LocalScope localscope(*this);
846 return node.children[0]->accept(*this);
849 Interpreter::Value Interpreter::operator()(TableInitializer<Iter,Interpreter::Value,FuncType> &node)
851 Interpreter::Value::NumberType current = 0;
852 typename Interpreter::Value::TableContainer table(new Table<Interpreter::Value>);
853 for(auto tmpchild : node.children)
855 auto child = static_cast<InitializerAssignmentExpression<Iter,Interpreter::Value,FuncType>*>(tmpchild.get());
856 if(child->children.size() == 1)
858 table->set(Interpreter::Value(current++), child->children[0]->accept(*this));
860 else
862 Interpreter::Value index = child->children[0]->accept(*this);
863 if(index.type() == Interpreter::Value::Type::Number && isint(index.number()))
865 current = index.number()+1;
867 table->set(index, child->children[1]->accept(*this));
870 return Interpreter::Value(table);
873 Interpreter::Value Interpreter::operator()(ArrayInitializer<Iter,Interpreter::Value,FuncType> &node)
875 typename Interpreter::Value::ArrayContainer array(new Array<Interpreter::Value>);
876 for(auto& tmpchild : node.children)
878 array->add(tmpchild->accept(*this));
880 return Interpreter::Value(array);
883 Interpreter::Value Interpreter::operator()(Function<Iter,Interpreter::Value,FuncType> &node)
885 return Interpreter::Value(Interpreter::Value::Type::Function, node.shared_from_this());
888 Interpreter::Value Interpreter::operator()(IdentifierList<Iter,Interpreter::Value,FuncType> &node)
890 auto i = m_function_stack.begin();
891 auto end = m_function_stack.end();
892 set(Interpreter::Value("this"), *i++);
893 for(auto child : node.children)
895 if(i==end)
897 break;
899 set(child->accept(*this), *i++);
901 m_function_stack.clear();
902 return Interpreter::Value();
905 Interpreter::Value Interpreter::operator()(BuiltinFunction<Iter,Interpreter::Value,FuncType> &node)
907 node.function(*this, m_function_stack);
908 return Interpreter::Value();
911 Interpreter::Value Interpreter::operator()(Call<Iter,Interpreter::Value,FuncType> &node)
913 std::vector<Interpreter::Value> args;
914 Interpreter::Value fun = node.children[0]->accept(*this);
915 if(fun.type() != Interpreter::Value::Type::Function)
917 error("can not call non-function", node);
918 return Interpreter::Value();
920 auto function = fun.function();
921 auto innerargs = makeArray();
922 for(size_t i = 1; i<node.children.size(); ++i)
924 auto val = node.children[i]->accept(*this);
925 args.push_back(val);
926 innerargs->add(val);
928 m_function_stack.push_back(Interpreter::Value());
929 for(size_t i = 1; i<node.children.size(); ++i)
931 m_function_stack.push_back(args[i-1]);
933 FunctionScope functionscope(this);
934 setLocal(Value("$args"), innerargs);
935 function->children[0]->accept(*this);
936 function->children[1]->accept(*this);
937 if(!m_function_stack.empty())
939 Interpreter::Value result = m_function_stack.back();
940 m_function_stack.clear();
941 return result;
943 else
945 return Interpreter::Value();
950 Interpreter::Value Interpreter::operator()(Tree<Iter,Interpreter::Value,FuncType> &node)
952 return Interpreter::Value(Interpreter::Value::Type::Tree, node.children[0]);
955 Interpreter::Value Interpreter::operator()(Root<Iter,Interpreter::Value,FuncType> &node)
957 if(node.children.empty())
959 return Interpreter::Value(Interpreter::Value::Type::Tree, node.root.lock());
961 else
963 Interpreter::Value tree = node.children[0]->accept(*this);
964 if(tree.type() == Interpreter::Value::Type::Tree || tree.type() == Interpreter::Value::Type::Function)
966 return Interpreter::Value(Interpreter::Value::Type::Tree, tree.pointer()->root.lock());
968 else
970 error("cannot find root of non-tree.", node);
971 return Interpreter::Value();