@@ -278,6 +278,8 @@ class Expression: public AstNode {
278278public:
279279 Expression (const Type *type, bool is_constant): type(type), is_constant(is_constant) {}
280280
281+ virtual Number eval_number () const = 0;
282+ virtual std::string eval_string () const = 0;
281283 virtual const VariableReference *get_reference () const { return nullptr ; }
282284 virtual void generate (Emitter &emitter) const = 0;
283285
@@ -306,6 +308,8 @@ class ConstantBooleanExpression: public Expression {
306308
307309 const bool value;
308310
311+ virtual Number eval_number () const { assert (false ); }
312+ virtual std::string eval_string () const { assert (false ); }
309313 virtual void generate (Emitter &emitter) const ;
310314
311315 virtual std::string text () const ;
@@ -317,6 +321,8 @@ class ConstantNumberExpression: public Expression {
317321
318322 const Number value;
319323
324+ virtual Number eval_number () const { return value; }
325+ virtual std::string eval_string () const { assert (false ); }
320326 virtual void generate (Emitter &emitter) const ;
321327
322328 virtual std::string text () const ;
@@ -328,6 +334,8 @@ class ConstantStringExpression: public Expression {
328334
329335 const std::string value;
330336
337+ virtual Number eval_number () const { assert (false ); }
338+ virtual std::string eval_string () const { return value; }
331339 virtual void generate (Emitter &emitter) const ;
332340
333341 virtual std::string text () const ;
@@ -339,6 +347,8 @@ class ConstantEnumExpression: public Expression {
339347
340348 const int value;
341349
350+ virtual Number eval_number () const { assert (false ); }
351+ virtual std::string eval_string () const { assert (false ); }
342352 virtual void generate (Emitter &emitter) const ;
343353
344354 virtual std::string text () const ;
@@ -352,6 +362,8 @@ class UnaryMinusExpression: public Expression {
352362
353363 const Expression *const value;
354364
365+ virtual Number eval_number () const { return number_negate (value->eval_number ()); }
366+ virtual std::string eval_string () const { assert (false ); }
355367 virtual void generate (Emitter &emitter) const ;
356368
357369 virtual std::string text () const {
@@ -370,6 +382,8 @@ class LogicalNotExpression: public Expression {
370382
371383 const Expression *const value;
372384
385+ virtual Number eval_number () const { assert (false ); }
386+ virtual std::string eval_string () const { assert (false ); }
373387 virtual void generate (Emitter &emitter) const ;
374388
375389 virtual std::string text () const {
@@ -390,6 +404,8 @@ class ConditionalExpression: public Expression {
390404 const Expression *left;
391405 const Expression *right;
392406
407+ virtual Number eval_number () const { assert (false ); }
408+ virtual std::string eval_string () const { assert (false ); }
393409 virtual void generate (Emitter &emitter) const ;
394410
395411 virtual std::string text () const {
@@ -410,6 +426,8 @@ class DisjunctionExpression: public Expression {
410426 const Expression *const left;
411427 const Expression *const right;
412428
429+ virtual Number eval_number () const { assert (false ); }
430+ virtual std::string eval_string () const { assert (false ); }
413431 virtual void generate (Emitter &emitter) const ;
414432
415433 virtual std::string text () const {
@@ -430,6 +448,8 @@ class ConjunctionExpression: public Expression {
430448 const Expression *const left;
431449 const Expression *const right;
432450
451+ virtual Number eval_number () const { assert (false ); }
452+ virtual std::string eval_string () const { assert (false ); }
433453 virtual void generate (Emitter &emitter) const ;
434454
435455 virtual std::string text () const {
@@ -459,6 +479,8 @@ class BooleanComparisonExpression: public ComparisonExpression {
459479public:
460480 BooleanComparisonExpression (const Expression *left, const Expression *right, Comparison comp): ComparisonExpression(left, right, comp) {}
461481
482+ virtual Number eval_number () const { assert (false ); }
483+ virtual std::string eval_string () const { assert (false ); }
462484 virtual void generate (Emitter &emitter) const ;
463485
464486 virtual std::string text () const {
@@ -470,6 +492,8 @@ class NumericComparisonExpression: public ComparisonExpression {
470492public:
471493 NumericComparisonExpression (const Expression *left, const Expression *right, Comparison comp): ComparisonExpression(left, right, comp) {}
472494
495+ virtual Number eval_number () const { assert (false ); }
496+ virtual std::string eval_string () const { assert (false ); }
473497 virtual void generate (Emitter &emitter) const ;
474498
475499 virtual std::string text () const {
@@ -481,6 +505,8 @@ class StringComparisonExpression: public ComparisonExpression {
481505public:
482506 StringComparisonExpression (const Expression *left, const Expression *right, Comparison comp): ComparisonExpression(left, right, comp) {}
483507
508+ virtual Number eval_number () const { assert (false ); }
509+ virtual std::string eval_string () const { assert (false ); }
484510 virtual void generate (Emitter &emitter) const ;
485511
486512 virtual std::string text () const {
@@ -492,6 +518,8 @@ class ArrayComparisonExpression: public ComparisonExpression {
492518public:
493519 ArrayComparisonExpression (const Expression *left, const Expression *right, Comparison comp): ComparisonExpression(left, right, comp) {}
494520
521+ virtual Number eval_number () const { assert (false ); }
522+ virtual std::string eval_string () const { assert (false ); }
495523 virtual void generate (Emitter &emitter) const ;
496524
497525 virtual std::string text () const {
@@ -503,6 +531,8 @@ class DictionaryComparisonExpression: public ComparisonExpression {
503531public:
504532 DictionaryComparisonExpression (const Expression *left, const Expression *right, Comparison comp): ComparisonExpression(left, right, comp) {}
505533
534+ virtual Number eval_number () const { assert (false ); }
535+ virtual std::string eval_string () const { assert (false ); }
506536 virtual void generate (Emitter &emitter) const ;
507537
508538 virtual std::string text () const {
@@ -520,6 +550,8 @@ class AdditionExpression: public Expression {
520550 const Expression *const left;
521551 const Expression *const right;
522552
553+ virtual Number eval_number () const { return number_add (left->eval_number (), right->eval_number ()); }
554+ virtual std::string eval_string () const { assert (false ); }
523555 virtual void generate (Emitter &emitter) const ;
524556
525557 virtual std::string text () const {
@@ -540,6 +572,8 @@ class SubtractionExpression: public Expression {
540572 const Expression *const left;
541573 const Expression *const right;
542574
575+ virtual Number eval_number () const { return number_subtract (left->eval_number (), right->eval_number ()); }
576+ virtual std::string eval_string () const { assert (false ); }
543577 virtual void generate (Emitter &emitter) const ;
544578
545579 virtual std::string text () const {
@@ -560,6 +594,8 @@ class MultiplicationExpression: public Expression {
560594 const Expression *const left;
561595 const Expression *const right;
562596
597+ virtual Number eval_number () const { return number_multiply (left->eval_number (), right->eval_number ()); }
598+ virtual std::string eval_string () const { assert (false ); }
563599 virtual void generate (Emitter &emitter) const ;
564600
565601 virtual std::string text () const {
@@ -580,6 +616,8 @@ class DivisionExpression: public Expression {
580616 const Expression *const left;
581617 const Expression *const right;
582618
619+ virtual Number eval_number () const { return number_divide (left->eval_number (), right->eval_number ()); }
620+ virtual std::string eval_string () const { assert (false ); }
583621 virtual void generate (Emitter &emitter) const ;
584622
585623 virtual std::string text () const {
@@ -600,6 +638,8 @@ class ModuloExpression: public Expression {
600638 const Expression *const left;
601639 const Expression *const right;
602640
641+ virtual Number eval_number () const { return number_modulo (left->eval_number (), right->eval_number ()); }
642+ virtual std::string eval_string () const { assert (false ); }
603643 virtual void generate (Emitter &emitter) const ;
604644
605645 virtual std::string text () const {
@@ -620,6 +660,8 @@ class ExponentiationExpression: public Expression {
620660 const Expression *const left;
621661 const Expression *const right;
622662
663+ virtual Number eval_number () const { return number_pow (left->eval_number (), right->eval_number ()); }
664+ virtual std::string eval_string () const { assert (false ); }
623665 virtual void generate (Emitter &emitter) const ;
624666
625667 virtual std::string text () const {
@@ -738,6 +780,8 @@ class VariableExpression: public Expression {
738780
739781 const VariableReference *var;
740782
783+ virtual Number eval_number () const { assert (false ); }
784+ virtual std::string eval_string () const { assert (false ); }
741785 virtual const VariableReference *get_reference () const { return var; }
742786 virtual void generate (Emitter &emitter) const ;
743787
@@ -756,6 +800,8 @@ class FunctionCall: public Expression {
756800 const VariableReference *const func;
757801 const std::vector<const Expression *> args;
758802
803+ virtual Number eval_number () const { assert (false ); }
804+ virtual std::string eval_string () const { assert (false ); }
759805 virtual void generate (Emitter &emitter) const ;
760806
761807 virtual std::string text () const ;
0 commit comments