grand renaming to 'aqua' (well, 'Aqua' actually)
[aqualang.git] / src / ops.cpp
blobfe5409ba260e1015f51a181eb71ecb04642bd9aa
2 #include "private.h"
4 namespace Aqua
6 using namespace Internal;
8 Interpreter::Value Interpreter::operator()(Variable<Iter,Interpreter::Value,FuncType> &node)
10 return get(node.name);
13 Interpreter::Value Interpreter::operator()(FieldName<Iter,Interpreter::Value,FuncType> &node)
15 return node.name;
18 Interpreter::Value Interpreter::operator()(Constant<Iter,Interpreter::Value,FuncType> &node)
20 return node.value;
23 Interpreter::Value Interpreter::operator()(Nop<Iter,Interpreter::Value,FuncType>&)
25 return Interpreter::Value(1.0);
28 Interpreter::Value Interpreter::operator()(Nil<Iter,Interpreter::Value,FuncType>&)
30 return Interpreter::Value();
33 Interpreter::Value Interpreter::operator()(String<Iter,Interpreter::Value,FuncType> &node)
35 return node.value;
38 Interpreter::Value Interpreter::operator()(Parens<Iter,Interpreter::Value,FuncType> &node)
40 return node.children[0]->accept(*this);
44 Interpreter::Value Interpreter::operator()(Type<Iter,Interpreter::Value,FuncType> &node)
46 Interpreter::Value expr;
47 expr = node.children[0]->accept(*this);
48 switch(expr.type())
50 case Interpreter::Value::Type::String:
51 return Interpreter::Value(std::string("string"));
52 case Interpreter::Value::Type::Number:
53 return Interpreter::Value(std::string("number"));
54 case Interpreter::Value::Type::Tree:
55 return Interpreter::Value(std::string("tree"));
56 case Interpreter::Value::Type::Function:
57 return Interpreter::Value(std::string("function"));
58 case Interpreter::Value::Type::Table:
59 return Interpreter::Value(std::string("table"));
60 case Interpreter::Value::Type::Array:
61 return Interpreter::Value(std::string("array"));
62 case Interpreter::Value::Type::Nil:
63 return Interpreter::Value(std::string("nil"));
64 default:
65 error("unknown type", node);
66 return Interpreter::Value();
70 Interpreter::Value Interpreter::operator()(Size<Iter,Interpreter::Value,FuncType> &node)
72 Interpreter::Value expr;
73 expr = node.children[0]->accept(*this);
74 switch(expr.type())
76 case Interpreter::Value::Type::String:
77 return Interpreter::Value(expr.string().size());
78 case Interpreter::Value::Type::Number:
79 return Interpreter::Value(1);
80 case Interpreter::Value::Type::Tree:
81 return Interpreter::Value(expr.pointer()->size());
82 case Interpreter::Value::Type::Function:
83 return Interpreter::Value(expr.pointer()->size());
84 case Interpreter::Value::Type::Table:
85 return Interpreter::Value(expr.table()->size());
86 case Interpreter::Value::Type::Array:
87 return Interpreter::Value(expr.array()->size());
88 case Interpreter::Value::Type::Nil:
89 return Interpreter::Value(0.0);
90 default:
91 error("unknown type", node);
92 return Interpreter::Value();
96 Interpreter::Value Interpreter::operator()(FieldAccess<Iter,Interpreter::Value,FuncType> &node)
98 int idx;
99 Interpreter::Value left;
100 Interpreter::Value right;
101 left = node.children[0]->accept(*this);
102 if(left.type() == Interpreter::Value::Type::Table)
104 right = node.children[1]->accept(*this);
105 return left.table()->get(right);
107 else if(left.type() == Interpreter::Value::Type::Array)
109 right = node.children[1]->accept(*this);
110 if(right.type() != Interpreter::Value::Type::Number || !isint(right.number()))
112 error("array index not a integer", node);
114 idx = right.number();
115 if(idx<0 || idx>=int(left.array()->size()))
117 error("array index out of range", node);
119 return left.array()->get(right);
121 else if(left.type() == Interpreter::Value::Type::String)
123 auto selfstr = left.string();
124 right = node.children[1]->accept(*this);
125 if(right.type() != Interpreter::Value::Type::Number || !isint(right.number()))
127 error("string index not an integer", node);
129 idx = right.number();
130 if((idx < 0) || (idx >= int(selfstr.size())))
132 error("string index out of range", node);
134 return Value(Value::NumberType(selfstr.at(idx)));
136 else
138 error("can only index tables or arrays", node);
139 return Interpreter::Value();
143 Interpreter::Value Interpreter::operator()(FieldAssignment<Iter,Interpreter::Value,FuncType> &node)
145 Interpreter::Value table;
146 table = node.children[0]->accept(*this);
147 if(table.type() == Interpreter::Value::Type::Table)
149 Interpreter::Value index = node.children[1]->accept(*this);
150 Interpreter::Value value = node.children[2]->accept(*this);
151 table.table()->set(index, value);
152 return value;
154 else if(table.type() == Interpreter::Value::Type::Array)
156 Interpreter::Value index = node.children[1]->accept(*this);
157 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
159 error("array index not a integer.", node);
161 int idx = index.number();
162 if(idx<0 || idx>=int(table.array()->size()))
164 error("array index out of range.", node);
166 Interpreter::Value value = node.children[2]->accept(*this);
167 table.array()->set(index, value);
168 return value;
170 else
172 error("can only index tables or arrays.", node);
173 return Interpreter::Value();
177 Interpreter::Value Interpreter::operator()(AddFieldAssignment<Iter,Interpreter::Value,FuncType> &node)
179 Interpreter::Value table;
180 Interpreter::Value index, left, right;
181 Interpreter::Value::Type t;
182 table = node.children[0]->accept(*this);
183 t = table.type();
184 if(t == Interpreter::Value::Type::Table)
186 index = node.children[1]->accept(*this);
187 left = table.table()->get(index);
188 right = node.children[2]->accept(*this);
190 else if(t == Interpreter::Value::Type::Array)
192 index = node.children[1]->accept(*this);
193 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
195 error("array index not a integer.", node);
197 int idx = index.number();
198 if(idx<0 || idx>=int(table.array()->size()))
200 error("array index out of range.", node);
202 left = table.array()->get(index);
203 right = node.children[2]->accept(*this);
205 else
207 error("can only index tables and arrays.", node);
208 return Interpreter::Value();
210 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
212 left = Interpreter::Value(left.number() + right.number());
214 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
216 left.string() += right.string();
218 else if(left.type() == Interpreter::Value::Type::Table && right.type() == Interpreter::Value::Type::Table)
220 left.table()->append(*right.table());
222 else if(left.type() == Interpreter::Value::Type::Array && right.type() == Interpreter::Value::Type::Array)
224 left.array()->append(*right.array());
226 else
228 error("invalid operands '+='.", node);
229 return Interpreter::Value();
231 if(t == Interpreter::Value::Type::Table)
233 table.table()->set(index, left);
235 else if(t == Interpreter::Value::Type::Array)
237 table.array()->set(index, left);
239 return left;
242 Interpreter::Value Interpreter::operator()(SubFieldAssignment<Iter,Interpreter::Value,FuncType> &node)
244 Interpreter::Value table = node.children[0]->accept(*this);
245 Interpreter::Value index, left, right;
246 Interpreter::Value::Type t = table.type();
247 if(t == Interpreter::Value::Type::Table)
249 index = node.children[1]->accept(*this);
250 left = table.table()->get(index);
251 right = node.children[2]->accept(*this);
253 else if(t == Interpreter::Value::Type::Array)
255 index = node.children[1]->accept(*this);
256 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
258 error("array index not a integer.", node);
260 int idx = index.number();
261 if(idx<0 || idx>=int(table.array()->size()))
263 error("array index out of range.", node);
265 left = table.array()->get(index);
266 right = node.children[2]->accept(*this);
268 else
270 error("can only index tables and arrays.", node);
271 return Interpreter::Value();
273 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
275 left = Interpreter::Value(left.number() - right.number());
277 else
279 error("invalid operands to '-='.", node);
280 return Interpreter::Value();
282 if(t == Interpreter::Value::Type::Table)
284 table.table()->set(index, left);
286 else if(t == Interpreter::Value::Type::Array)
288 table.array()->set(index, left);
290 return left;
293 Interpreter::Value Interpreter::operator()(MulFieldAssignment<Iter,Interpreter::Value,FuncType> &node)
295 Interpreter::Value table = node.children[0]->accept(*this);
296 Interpreter::Value index, left, right;
297 Interpreter::Value::Type t = table.type();
298 if(t == Interpreter::Value::Type::Table)
300 index = node.children[1]->accept(*this);
301 left = table.table()->get(index);
302 right = node.children[2]->accept(*this);
304 else if(t == Interpreter::Value::Type::Array)
306 index = node.children[1]->accept(*this);
307 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
309 error("array index not a integer.", node);
311 int idx = index.number();
312 if(idx<0 || idx>=int(table.array()->size()))
314 error("array index out of range.", node);
316 left = table.array()->get(index);
317 right = node.children[2]->accept(*this);
319 else
321 error("can only index tables and arrays.", node);
322 return Interpreter::Value();
324 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
326 left = Interpreter::Value(left.number() * right.number());
328 else
330 error("invalid operands to '*='.", node);
331 return Interpreter::Value();
333 if(t == Interpreter::Value::Type::Table)
335 table.table()->set(index, left);
337 else if(t == Interpreter::Value::Type::Array)
339 table.array()->set(index, left);
341 return left;
344 Interpreter::Value Interpreter::operator()(DivFieldAssignment<Iter,Interpreter::Value,FuncType> &node)
346 Interpreter::Value table = node.children[0]->accept(*this);
347 Interpreter::Value index, left, right;
348 Interpreter::Value::Type t = table.type();
349 if(t == Interpreter::Value::Type::Table)
351 index = node.children[1]->accept(*this);
352 left = table.table()->get(index);
353 right = node.children[2]->accept(*this);
355 else if(t == Interpreter::Value::Type::Array)
357 index = node.children[1]->accept(*this);
358 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
360 error("array index not a integer.", node);
362 int idx = index.number();
363 if(idx<0 || idx>=int(table.array()->size()))
365 error("array index out of range.", node);
367 left = table.array()->get(index);
368 right = node.children[2]->accept(*this);
370 else
372 error("can only index tables and arrays.", node);
373 return Interpreter::Value();
375 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
377 left = Interpreter::Value(left.number() / right.number());
379 else
381 error("invalid operands to '/='.", node);
382 return Interpreter::Value();
384 if(t == Interpreter::Value::Type::Table)
386 table.table()->set(index, left);
388 else if(t == Interpreter::Value::Type::Array)
390 table.array()->set(index, left);
392 return left;
395 Interpreter::Value Interpreter::operator()(ModFieldAssignment<Iter,Interpreter::Value,FuncType> &node)
397 Interpreter::Value table = node.children[0]->accept(*this);
398 Interpreter::Value index, left, right;
399 Interpreter::Value::Type t = table.type();
400 if(t == Interpreter::Value::Type::Table)
402 index = node.children[1]->accept(*this);
403 left = table.table()->get(index);
404 right = node.children[2]->accept(*this);
406 else if(t == Interpreter::Value::Type::Array)
408 index = node.children[1]->accept(*this);
409 if(index.type() != Interpreter::Value::Type::Number || !isint(index.number()))
411 error("array index not a integer.", node);
413 int idx = index.number();
414 if(idx<0 || idx>=int(table.array()->size()))
416 error("array index out of range.", node);
418 left = table.array()->get(index);
419 right = node.children[2]->accept(*this);
421 else
423 error("can only index tables and arrays.", node);
424 return Interpreter::Value();
426 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
428 left = Interpreter::Value(std::fmod(left.number(), right.number()));
430 else
432 error("invalid operands to '%='.", node);
433 return Interpreter::Value();
435 if(t == Interpreter::Value::Type::Table)
437 table.table()->set(index, left);
439 else if(t == Interpreter::Value::Type::Array)
441 table.array()->set(index, left);
443 return left;
446 Interpreter::Value Interpreter::operator()(UnaryPlusExpression<Iter,Interpreter::Value,FuncType> &node)
448 Interpreter::Value operand = node.children[0]->accept(*this);
449 if(operand.type() != Interpreter::Value::Type::Number)
451 error("invalid operand to '+'.", node);
453 return operand;
456 Interpreter::Value Interpreter::operator()(UnaryMinusExpression<Iter,Interpreter::Value,FuncType> &node)
458 Interpreter::Value operand = node.children[0]->accept(*this);
459 if(operand.type() != Interpreter::Value::Type::Number)
461 error("invalid operand to '-'.", node);
463 return Interpreter::Value(-operand.number());
466 Interpreter::Value Interpreter::operator()(UnaryNotExpression<Iter,Interpreter::Value,FuncType> &node)
468 Interpreter::Value operand = node.children[0]->accept(*this);
469 if(operand.type() != Interpreter::Value::Type::Number)
471 error("invalid operand to '!'.", node);
473 return Interpreter::Value(operand.number()==0.0?1.0:0.0);
476 Interpreter::Value Interpreter::operator()(MultiplyExpression<Iter,Interpreter::Value,FuncType> &node)
478 Interpreter::Value left = node.children[0]->accept(*this);
479 Interpreter::Value right = node.children[1]->accept(*this);
480 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
482 return Interpreter::Value(left.number() * right.number());
484 else
486 error("invalid operands to '*'.", node);
487 return Interpreter::Value();
491 Interpreter::Value Interpreter::operator()(DivideExpression<Iter,Interpreter::Value,FuncType> &node)
493 Interpreter::Value left = node.children[0]->accept(*this);
494 Interpreter::Value right = node.children[1]->accept(*this);
495 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
497 return Interpreter::Value(left.number() / right.number());
499 else
501 error("invalid operands to '/'.", node);
502 return Interpreter::Value();
506 Interpreter::Value Interpreter::operator()(ModuloExpression<Iter,Interpreter::Value,FuncType> &node)
508 Interpreter::Value left = node.children[0]->accept(*this);
509 Interpreter::Value right = node.children[1]->accept(*this);
510 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
512 return Interpreter::Value(std::fmod(left.number(), right.number()));
514 else
516 error("invalid operands to '%'.", node);
517 return Interpreter::Value();
521 Interpreter::Value Interpreter::operator()(AddExpression<Iter,Interpreter::Value,FuncType> &node)
523 Interpreter::Value left = node.children[0]->accept(*this);
524 Interpreter::Value right = node.children[1]->accept(*this);
525 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
527 return Interpreter::Value(left.number() + right.number());
529 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
531 return Interpreter::Value(left.string() + right.string());
533 else if(left.type() == Interpreter::Value::Type::Table && right.type() == Interpreter::Value::Type::Table)
535 typename Interpreter::Value::TableContainer table(new Table<Interpreter::Value>);
536 table->append(*left.table());
537 table->append(*right.table());
538 return Interpreter::Value(table);
540 else if(left.type() == Interpreter::Value::Type::Array && right.type() == Interpreter::Value::Type::Array)
542 typename Interpreter::Value::ArrayContainer array(new Array<Interpreter::Value>);
543 array->append(*left.array());
544 array->append(*right.array());
545 return Interpreter::Value(array);
547 else
549 error("invalid operands to '+'.", node);
550 return Interpreter::Value();
554 Interpreter::Value Interpreter::operator()(SubtractExpression<Iter,Interpreter::Value,FuncType> &node)
556 Interpreter::Value left = node.children[0]->accept(*this);
557 Interpreter::Value right = node.children[1]->accept(*this);
558 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
560 return Interpreter::Value(left.number() - right.number());
562 else
564 error("invalid operands to '-'.", node);
565 return Interpreter::Value();
569 Interpreter::Value Interpreter::operator()(LessExpression<Iter,Interpreter::Value,FuncType> &node)
571 Interpreter::Value left = node.children[0]->accept(*this);
572 Interpreter::Value right = node.children[1]->accept(*this);
573 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
575 return Interpreter::Value(left.number() < right.number());
577 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
579 return Interpreter::Value(left.string() < right.string());
581 else
583 error("invalid operands to '<'.", node);
584 return Interpreter::Value();
588 Interpreter::Value Interpreter::operator()(LessEqualExpression<Iter,Interpreter::Value,FuncType> &node)
590 Interpreter::Value left = node.children[0]->accept(*this);
591 Interpreter::Value right = node.children[1]->accept(*this);
592 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
594 return Interpreter::Value(left.number() <= right.number());
596 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
598 return Interpreter::Value(left.string() <= right.string());
600 else
602 error("invalid operands to '<='.", node);
603 return Interpreter::Value();
607 Interpreter::Value Interpreter::operator()(GreaterExpression<Iter,Interpreter::Value,FuncType> &node)
609 Interpreter::Value left = node.children[0]->accept(*this);
610 Interpreter::Value right = node.children[1]->accept(*this);
611 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
613 return Interpreter::Value(left.number() > right.number());
615 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
617 return Interpreter::Value(left.string() > right.string());
619 else
621 error("invalid operands to '>'.", node);
622 return Interpreter::Value();
626 Interpreter::Value Interpreter::operator()(GreaterEqualExpression<Iter,Interpreter::Value,FuncType> &node)
628 Interpreter::Value left = node.children[0]->accept(*this);
629 Interpreter::Value right = node.children[1]->accept(*this);
630 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
632 return Interpreter::Value(left.number() >= right.number());
634 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
636 return Interpreter::Value(left.string() >= right.string());
638 else
640 error("invalid operands to '>='.", node);
641 return Interpreter::Value();
645 Interpreter::Value Interpreter::operator()(EqualExpression<Iter,Interpreter::Value,FuncType> &node)
647 Interpreter::Value left = node.children[0]->accept(*this);
648 Interpreter::Value right = node.children[1]->accept(*this);
649 return Interpreter::Value(left == right);
652 Interpreter::Value Interpreter::operator()(NotEqualExpression<Iter,Interpreter::Value,FuncType> &node)
654 Interpreter::Value left = node.children[0]->accept(*this);
655 Interpreter::Value right = node.children[1]->accept(*this);
656 return Interpreter::Value(!(left == right));
659 Interpreter::Value Interpreter::operator()(LogicalAndExpression<Iter,Interpreter::Value,FuncType> &node)
661 Interpreter::Value left = node.children[0]->accept(*this);
662 if(left.type() == Interpreter::Value::Type::Number)
664 if(left.number() != 0.0)
666 Interpreter::Value right = node.children[1]->accept(*this);
667 if(right.type() == Interpreter::Value::Type::Number)
669 return Interpreter::Value(right.number() != 0.0);
671 else
673 error("invalid operands to '&&'.", node);
674 return Interpreter::Value();
677 else
679 return Interpreter::Value(0.0);
682 else
684 error("invalid operands to '&&'.", node);
685 return Interpreter::Value();
689 Interpreter::Value Interpreter::operator()(LogicalOrExpression<Iter,Interpreter::Value,FuncType> &node)
691 Interpreter::Value left = node.children[0]->accept(*this);
692 if(left.type() == Interpreter::Value::Type::Number)
694 if(left.number() == 0.0)
696 Interpreter::Value right = node.children[1]->accept(*this);
697 if(right.type() == Interpreter::Value::Type::Number)
699 return Interpreter::Value(right.number() != 0.0);
701 else
703 error("invalid operands to '||'.", node);
704 return Interpreter::Value();
707 else
709 return Interpreter::Value(1.0);
712 else
714 error("invalid operands to '||'.", node);
715 return Interpreter::Value();
719 Interpreter::Value Interpreter::operator()(AssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
721 Interpreter::Value left = node.children[0]->accept(*this);
722 Interpreter::Value right = node.children[1]->accept(*this);
723 set(left, right);
724 return right;
727 Interpreter::Value Interpreter::operator()(GlobalAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
729 Interpreter::Value left = node.children[0]->accept(*this);
730 Interpreter::Value right = node.children[1]->accept(*this);
731 setGlobal(left, right);
732 return right;
735 Interpreter::Value Interpreter::operator()(LocalAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
737 Interpreter::Value left = node.children[0]->accept(*this);
738 Interpreter::Value right = node.children[1]->accept(*this);
739 setLocal(left, right);
740 return right;
743 Interpreter::Value Interpreter::operator()(AddAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
745 Interpreter::Value name = node.children[0]->accept(*this);
746 Interpreter::Value left = get(name);
747 Interpreter::Value right = node.children[1]->accept(*this);
748 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
750 left = Interpreter::Value(left.number() + right.number());
752 else if(left.type() == Interpreter::Value::Type::String && right.type() == Interpreter::Value::Type::String)
754 left.string() += right.string();
756 else if(left.type() == Interpreter::Value::Type::Table && right.type() == Interpreter::Value::Type::Table)
758 left.table()->append(*right.table());
760 else if(left.type() == Interpreter::Value::Type::Array && right.type() == Interpreter::Value::Type::Array)
762 left.array()->append(*right.array());
764 else
766 error("invalid operands to '+='.", node);
767 return Interpreter::Value();
769 set(name, left);
770 return left;
773 Interpreter::Value Interpreter::operator()(SubAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
775 Interpreter::Value name = node.children[0]->accept(*this);
776 Interpreter::Value left = get(name);
777 Interpreter::Value right = node.children[1]->accept(*this);
778 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
780 left = Interpreter::Value(left.number() - right.number());
782 else
784 error("invalid operands to '-='.", node);
785 return Interpreter::Value();
787 set(name, left);
788 return left;
791 Interpreter::Value Interpreter::operator()(MulAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
793 Interpreter::Value name = node.children[0]->accept(*this);
794 Interpreter::Value left = get(name);
795 Interpreter::Value right = node.children[1]->accept(*this);
796 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
798 left = Interpreter::Value(left.number() * right.number());
800 else
802 error("invalid operands to '*='.", node);
803 return Interpreter::Value();
805 set(name, left);
806 return left;
809 Interpreter::Value Interpreter::operator()(DivAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
811 Interpreter::Value name = node.children[0]->accept(*this);
812 Interpreter::Value left = get(name);
813 Interpreter::Value right = node.children[1]->accept(*this);
814 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
816 left = Interpreter::Value(left.number() / right.number());
818 else
820 error("invalid operands to '/='.", node);
821 return Interpreter::Value();
823 set(name, left);
824 return left;
827 Interpreter::Value Interpreter::operator()(ModAssignmentExpression<Iter,Interpreter::Value,FuncType> &node)
829 Interpreter::Value name = node.children[0]->accept(*this);
830 Interpreter::Value left = get(name);
831 Interpreter::Value right = node.children[1]->accept(*this);
832 if(left.type() == Interpreter::Value::Type::Number && right.type() == Interpreter::Value::Type::Number)
834 left = Interpreter::Value(std::fmod(left.number(), right.number()));
836 else
838 error("invalid operands to '%='.", node);
839 return Interpreter::Value();
841 set(name, left);
842 return left;
845 Interpreter::Value Interpreter::operator()(Block<Iter,Interpreter::Value,FuncType> &node)
847 LocalScope localscope(*this);
848 return node.children[0]->accept(*this);
851 Interpreter::Value Interpreter::operator()(TableInitializer<Iter,Interpreter::Value,FuncType> &node)
853 Interpreter::Value::NumberType current = 0;
854 typename Interpreter::Value::TableContainer table(new Table<Interpreter::Value>);
855 for(auto tmpchild : node.children)
857 auto child = static_cast<InitializerAssignmentExpression<Iter,Interpreter::Value,FuncType>*>(tmpchild.get());
858 if(child->children.size() == 1)
860 table->set(Interpreter::Value(current++), child->children[0]->accept(*this));
862 else
864 Interpreter::Value index = child->children[0]->accept(*this);
865 if(index.type() == Interpreter::Value::Type::Number && isint(index.number()))
867 current = index.number()+1;
869 table->set(index, child->children[1]->accept(*this));
872 return Interpreter::Value(table);
875 Interpreter::Value Interpreter::operator()(ArrayInitializer<Iter,Interpreter::Value,FuncType> &node)
877 typename Interpreter::Value::ArrayContainer array(new Array<Interpreter::Value>);
878 for(auto& tmpchild : node.children)
880 array->add(tmpchild->accept(*this));
882 return Interpreter::Value(array);
885 Interpreter::Value Interpreter::operator()(Function<Iter,Interpreter::Value,FuncType> &node)
887 return Interpreter::Value(Interpreter::Value::Type::Function, node.shared_from_this());
890 Interpreter::Value Interpreter::operator()(IdentifierList<Iter,Interpreter::Value,FuncType> &node)
892 auto i = m_function_stack.begin();
893 auto end = m_function_stack.end();
894 set(Interpreter::Value("this"), *i++);
895 for(auto child : node.children)
897 if(i==end)
899 break;
901 set(child->accept(*this), *i++);
903 m_function_stack.clear();
904 return Interpreter::Value();
907 Interpreter::Value Interpreter::operator()(BuiltinFunction<Iter,Interpreter::Value,FuncType> &node)
909 node.function(*this, m_function_stack);
910 return Interpreter::Value();
913 Interpreter::Value Interpreter::operator()(Call<Iter,Interpreter::Value,FuncType> &node)
915 std::vector<Interpreter::Value> args;
916 Interpreter::Value fun = node.children[0]->accept(*this);
917 if(fun.type() != Interpreter::Value::Type::Function)
919 error("can not call non-function", node);
920 return Interpreter::Value();
922 auto function = fun.function();
923 auto innerargs = makeArray();
924 for(size_t i = 1; i<node.children.size(); ++i)
926 auto val = node.children[i]->accept(*this);
927 args.push_back(val);
928 innerargs->add(val);
930 m_function_stack.push_back(Interpreter::Value());
931 for(size_t i = 1; i<node.children.size(); ++i)
933 m_function_stack.push_back(args[i-1]);
935 FunctionScope functionscope(this);
936 setLocal(Value("$args"), innerargs);
937 function->children[0]->accept(*this);
938 function->children[1]->accept(*this);
939 if(!m_function_stack.empty())
941 Interpreter::Value result = m_function_stack.back();
942 m_function_stack.clear();
943 return result;
945 else
947 return Interpreter::Value();
952 Interpreter::Value Interpreter::operator()(Tree<Iter,Interpreter::Value,FuncType> &node)
954 return Interpreter::Value(Interpreter::Value::Type::Tree, node.children[0]);
957 Interpreter::Value Interpreter::operator()(Root<Iter,Interpreter::Value,FuncType> &node)
959 if(node.children.empty())
961 return Interpreter::Value(Interpreter::Value::Type::Tree, node.root.lock());
963 else
965 Interpreter::Value tree = node.children[0]->accept(*this);
966 if(tree.type() == Interpreter::Value::Type::Tree || tree.type() == Interpreter::Value::Type::Function)
968 return Interpreter::Value(Interpreter::Value::Type::Tree, tree.pointer()->root.lock());
970 else
972 error("cannot find root of non-tree.", node);
973 return Interpreter::Value();