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
;
45 expr
= node
.children
[0]->accept(*this);
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"));
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);
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);
89 error("unknown type", node
);
90 return Interpreter::Value();
94 Interpreter::Value
Interpreter::operator()(FieldAccess
<Iter
,Interpreter::Value
,FuncType
> &node
)
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
)));
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
);
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
);
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);
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);
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());
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
);
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);
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());
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
);
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);
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());
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
);
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);
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());
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
);
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);
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()));
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
);
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
);
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());
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());
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()));
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
);
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());
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());
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());
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());
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());
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);
671 error("invalid operands to '&&'.", node
);
672 return Interpreter::Value();
677 return Interpreter::Value(0.0);
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);
701 error("invalid operands to '||'.", node
);
702 return Interpreter::Value();
707 return Interpreter::Value(1.0);
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);
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
);
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
);
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());
764 error("invalid operands to '+='.", node
);
765 return Interpreter::Value();
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());
782 error("invalid operands to '-='.", node
);
783 return Interpreter::Value();
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());
800 error("invalid operands to '*='.", node
);
801 return Interpreter::Value();
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());
818 error("invalid operands to '/='.", node
);
819 return Interpreter::Value();
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()));
836 error("invalid operands to '%='.", node
);
837 return Interpreter::Value();
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));
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
)
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);
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();
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());
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());
970 error("cannot find root of non-tree.", node
);
971 return Interpreter::Value();