first impl of builtin member methods (thus far, string.size implemented. more to...
[aqualang.git] / src / ops.cpp
blob7bc80af2e0a52ac7f87712e7c0b4a6368bbd2947
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 = node.children[0]->accept(*this);
45 switch(expr.type())
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"));
61 default:
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);
70 switch(expr.type())
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);
86 default:
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);
114 else
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);
129 return 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);
145 return value;
147 else
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);
180 else
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());
201 else
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);
214 return 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);
243 else
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());
252 else
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);
265 return 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);
294 else
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());
303 else
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);
316 return 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);
345 else
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());
354 else
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);
367 return 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);
396 else
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()));
405 else
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);
418 return 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);
428 return operand;
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());
459 else
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());
474 else
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()));
489 else
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);
522 else
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());
537 else
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());
556 else
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());
575 else
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());
594 else
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());
613 else
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);
646 else
648 error("invalid operands to '&&'.", node);
649 return Interpreter::Value();
652 else
654 return Interpreter::Value(0.0);
657 else
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);
676 else
678 error("invalid operands to '||'.", node);
679 return Interpreter::Value();
682 else
684 return Interpreter::Value(1.0);
687 else
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);
698 set(left, right);
699 return right;
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);
707 return 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);
715 return 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());
739 else
741 error("invalid operands to '+='.", node);
742 return Interpreter::Value();
744 set(name, left);
745 return left;
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());
757 else
759 error("invalid operands to '-='.", node);
760 return Interpreter::Value();
762 set(name, left);
763 return left;
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());
775 else
777 error("invalid operands to '*='.", node);
778 return Interpreter::Value();
780 set(name, left);
781 return left;
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());
793 else
795 error("invalid operands to '/='.", node);
796 return Interpreter::Value();
798 set(name, left);
799 return left;
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()));
811 else
813 error("invalid operands to '%='.", node);
814 return Interpreter::Value();
816 set(name, left);
817 return left;
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));
837 else
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)
872 if(i==end)
874 break;
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();
914 return result;
916 else
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());
934 else
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());
941 else
943 error("cannot find root of non-tree.", node);
944 return Interpreter::Value();