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
)
18 Interpreter::Value
Interpreter::operator()(Constant
<Iter
,Interpreter::Value
,FuncType
> &node
)
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
)
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);
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"));
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);
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);
91 error("unknown type", node
);
92 return Interpreter::Value();
96 Interpreter::Value
Interpreter::operator()(FieldAccess
<Iter
,Interpreter::Value
,FuncType
> &node
)
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
)));
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
);
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
);
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);
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);
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());
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
);
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);
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());
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
);
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);
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());
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
);
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);
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());
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
);
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);
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()));
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
);
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
);
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());
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());
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()));
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
);
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());
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());
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());
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());
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());
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);
673 error("invalid operands to '&&'.", node
);
674 return Interpreter::Value();
679 return Interpreter::Value(0.0);
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);
703 error("invalid operands to '||'.", node
);
704 return Interpreter::Value();
709 return Interpreter::Value(1.0);
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);
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
);
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
);
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());
766 error("invalid operands to '+='.", node
);
767 return Interpreter::Value();
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());
784 error("invalid operands to '-='.", node
);
785 return Interpreter::Value();
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());
802 error("invalid operands to '*='.", node
);
803 return Interpreter::Value();
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());
820 error("invalid operands to '/='.", node
);
821 return Interpreter::Value();
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()));
838 error("invalid operands to '%='.", node
);
839 return Interpreter::Value();
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));
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
)
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);
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();
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());
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());
972 error("cannot find root of non-tree.", node
);
973 return Interpreter::Value();