Skip to content

Commit debcc6a

Browse files
committed
add eval functions for evaluating constants
1 parent 35071f7 commit debcc6a

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

ast.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,8 @@ class Expression: public AstNode {
278278
public:
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 {
459479
public:
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 {
470492
public:
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 {
481505
public:
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 {
492518
public:
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 {
503531
public:
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

Comments
 (0)