Skip to content

Commit 8f55aba

Browse files
committed
add is_constant flag for expressions
1 parent 24cb865 commit 8f55aba

4 files changed

Lines changed: 40 additions & 25 deletions

File tree

ast.h

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -269,12 +269,13 @@ class FunctionParameter: public LocalVariable {
269269

270270
class Expression: public AstNode {
271271
public:
272-
Expression(const Type *type): type(type) {}
272+
Expression(const Type *type, bool is_constant): type(type), is_constant(is_constant) {}
273273

274274
virtual const VariableReference *get_reference() const { return nullptr; }
275275
virtual void generate(Emitter &emitter) const = 0;
276276

277277
const Type *type;
278+
const bool is_constant;
278279
private:
279280
Expression(const Expression &);
280281
Expression &operator=(const Expression &);
@@ -294,7 +295,7 @@ class Constant: public Name {
294295

295296
class ConstantBooleanExpression: public Expression {
296297
public:
297-
ConstantBooleanExpression(bool value): Expression(TYPE_BOOLEAN), value(value) {}
298+
ConstantBooleanExpression(bool value): Expression(TYPE_BOOLEAN, true), value(value) {}
298299

299300
const bool value;
300301

@@ -305,7 +306,7 @@ class ConstantBooleanExpression: public Expression {
305306

306307
class ConstantNumberExpression: public Expression {
307308
public:
308-
ConstantNumberExpression(Number value): Expression(TYPE_NUMBER), value(value) {}
309+
ConstantNumberExpression(Number value): Expression(TYPE_NUMBER, true), value(value) {}
309310

310311
const Number value;
311312

@@ -316,7 +317,7 @@ class ConstantNumberExpression: public Expression {
316317

317318
class ConstantStringExpression: public Expression {
318319
public:
319-
ConstantStringExpression(const std::string &value): Expression(TYPE_STRING), value(value) {}
320+
ConstantStringExpression(const std::string &value): Expression(TYPE_STRING, true), value(value) {}
320321

321322
const std::string value;
322323

@@ -327,7 +328,7 @@ class ConstantStringExpression: public Expression {
327328

328329
class ConstantEnumExpression: public Expression {
329330
public:
330-
ConstantEnumExpression(const TypeEnum *type, int value): Expression(type), value(value) {}
331+
ConstantEnumExpression(const TypeEnum *type, int value): Expression(type, true), value(value) {}
331332

332333
const int value;
333334

@@ -338,7 +339,7 @@ class ConstantEnumExpression: public Expression {
338339

339340
class UnaryMinusExpression: public Expression {
340341
public:
341-
UnaryMinusExpression(const Expression *value): Expression(value->type), value(value) {
342+
UnaryMinusExpression(const Expression *value): Expression(value->type, value->is_constant), value(value) {
342343
assert(type == TYPE_NUMBER);
343344
}
344345

@@ -356,7 +357,7 @@ class UnaryMinusExpression: public Expression {
356357

357358
class LogicalNotExpression: public Expression {
358359
public:
359-
LogicalNotExpression(const Expression *value): Expression(value->type), value(value) {
360+
LogicalNotExpression(const Expression *value): Expression(value->type, value->is_constant), value(value) {
360361
assert(type == TYPE_BOOLEAN);
361362
}
362363

@@ -374,7 +375,7 @@ class LogicalNotExpression: public Expression {
374375

375376
class ConditionalExpression: public Expression {
376377
public:
377-
ConditionalExpression(const Expression *condition, const Expression *left, const Expression *right): Expression(left->type), condition(condition), left(left), right(right) {
378+
ConditionalExpression(const Expression *condition, const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant), condition(condition), left(left), right(right) {
378379
assert(left->type == right->type);
379380
}
380381

@@ -394,7 +395,7 @@ class ConditionalExpression: public Expression {
394395

395396
class DisjunctionExpression: public Expression {
396397
public:
397-
DisjunctionExpression(const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
398+
DisjunctionExpression(const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant), left(left), right(right) {
398399
assert(left->type == TYPE_BOOLEAN);
399400
assert(right->type == TYPE_BOOLEAN);
400401
}
@@ -414,7 +415,7 @@ class DisjunctionExpression: public Expression {
414415

415416
class ConjunctionExpression: public Expression {
416417
public:
417-
ConjunctionExpression(const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
418+
ConjunctionExpression(const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant), left(left), right(right) {
418419
assert(left->type == TYPE_BOOLEAN);
419420
assert(right->type == TYPE_BOOLEAN);
420421
}
@@ -437,7 +438,7 @@ class ComparisonExpression: public Expression {
437438
enum Comparison {
438439
EQ, NE, LT, GT, LE, GE
439440
};
440-
ComparisonExpression(const Expression *left, const Expression *right, Comparison comp): Expression(TYPE_BOOLEAN), left(left), right(right), comp(comp) {}
441+
ComparisonExpression(const Expression *left, const Expression *right, Comparison comp): Expression(TYPE_BOOLEAN, left->is_constant && right->is_constant), left(left), right(right), comp(comp) {}
441442

442443
const Expression *const left;
443444
const Expression *const right;
@@ -504,7 +505,7 @@ class DictionaryComparisonExpression: public ComparisonExpression {
504505

505506
class AdditionExpression: public Expression {
506507
public:
507-
AdditionExpression(const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
508+
AdditionExpression(const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant), left(left), right(right) {
508509
assert(left->type == TYPE_NUMBER);
509510
assert(right->type == TYPE_NUMBER);
510511
}
@@ -524,7 +525,7 @@ class AdditionExpression: public Expression {
524525

525526
class SubtractionExpression: public Expression {
526527
public:
527-
SubtractionExpression(const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
528+
SubtractionExpression(const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant), left(left), right(right) {
528529
assert(left->type == TYPE_NUMBER);
529530
assert(right->type == TYPE_NUMBER);
530531
}
@@ -544,7 +545,7 @@ class SubtractionExpression: public Expression {
544545

545546
class MultiplicationExpression: public Expression {
546547
public:
547-
MultiplicationExpression(const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
548+
MultiplicationExpression(const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant), left(left), right(right) {
548549
assert(left->type == TYPE_NUMBER);
549550
assert(right->type == TYPE_NUMBER);
550551
}
@@ -564,7 +565,7 @@ class MultiplicationExpression: public Expression {
564565

565566
class DivisionExpression: public Expression {
566567
public:
567-
DivisionExpression(const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
568+
DivisionExpression(const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant), left(left), right(right) {
568569
assert(left->type == TYPE_NUMBER);
569570
assert(right->type == TYPE_NUMBER);
570571
}
@@ -584,7 +585,7 @@ class DivisionExpression: public Expression {
584585

585586
class ModuloExpression: public Expression {
586587
public:
587-
ModuloExpression(const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
588+
ModuloExpression(const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant), left(left), right(right) {
588589
assert(left->type == TYPE_NUMBER);
589590
assert(right->type == TYPE_NUMBER);
590591
}
@@ -604,7 +605,7 @@ class ModuloExpression: public Expression {
604605

605606
class ExponentiationExpression: public Expression {
606607
public:
607-
ExponentiationExpression(const Expression *left, const Expression *right): Expression(left->type), left(left), right(right) {
608+
ExponentiationExpression(const Expression *left, const Expression *right): Expression(left->type, left->is_constant && right->is_constant), left(left), right(right) {
608609
assert(left->type == TYPE_NUMBER);
609610
assert(right->type == TYPE_NUMBER);
610611
}
@@ -624,9 +625,10 @@ class ExponentiationExpression: public Expression {
624625

625626
class VariableReference: public AstNode {
626627
public:
627-
VariableReference(const Type *type): type(type) {}
628+
VariableReference(const Type *type, bool is_constant): type(type), is_constant(is_constant) {}
628629

629630
const Type *type;
631+
const bool is_constant;
630632

631633
virtual void generate_address(Emitter &emitter) const = 0;
632634
virtual void generate_load(Emitter &emitter) const;
@@ -641,7 +643,7 @@ class VariableReference: public AstNode {
641643

642644
class ConstantReference: public VariableReference {
643645
public:
644-
ConstantReference(const Constant *cons): VariableReference(cons->type), cons(cons) {}
646+
ConstantReference(const Constant *cons): VariableReference(cons->type, true), cons(cons) {}
645647

646648
const Constant *cons;
647649

@@ -658,7 +660,7 @@ class ConstantReference: public VariableReference {
658660

659661
class ScalarVariableReference: public VariableReference {
660662
public:
661-
ScalarVariableReference(const Variable *var): VariableReference(var->type), var(var) {}
663+
ScalarVariableReference(const Variable *var): VariableReference(var->type, false), var(var) {}
662664

663665
const Variable *var;
664666

@@ -695,7 +697,7 @@ class StringReference: public VariableReference {
695697

696698
class ArrayReference: public VariableReference {
697699
public:
698-
ArrayReference(const Type *type, const VariableReference *array, const Expression *index): VariableReference(type), array(array), index(index) {}
700+
ArrayReference(const Type *type, const VariableReference *array, const Expression *index): VariableReference(type, array->is_constant), array(array), index(index) {}
699701

700702
const VariableReference *array;
701703
const Expression *index;
@@ -710,7 +712,7 @@ class ArrayReference: public VariableReference {
710712

711713
class DictionaryReference: public VariableReference {
712714
public:
713-
DictionaryReference(const Type *type, const VariableReference *dict, const Expression *index): VariableReference(type), dict(dict), index(index) {}
715+
DictionaryReference(const Type *type, const VariableReference *dict, const Expression *index): VariableReference(type, dict->is_constant), dict(dict), index(index) {}
714716

715717
const VariableReference *dict;
716718
const Expression *index;
@@ -725,7 +727,7 @@ class DictionaryReference: public VariableReference {
725727

726728
class VariableExpression: public Expression {
727729
public:
728-
VariableExpression(const VariableReference *var): Expression(var->type), var(var) {}
730+
VariableExpression(const VariableReference *var): Expression(var->type, var->is_constant), var(var) {}
729731

730732
const VariableReference *var;
731733

@@ -742,7 +744,7 @@ class VariableExpression: public Expression {
742744

743745
class FunctionCall: public Expression {
744746
public:
745-
FunctionCall(const VariableReference *func, const std::vector<const Expression *> &args): Expression(dynamic_cast<const TypeFunction *>(func->type)->returntype), func(func), args(args) {}
747+
FunctionCall(const VariableReference *func, const std::vector<const Expression *> &args): Expression(dynamic_cast<const TypeFunction *>(func->type)->returntype, false), func(func), args(args) {}
746748

747749
const VariableReference *const func;
748750
const std::vector<const Expression *> args;

parser.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static ComparisonExpression::Comparison comparisonFromToken(const Token &token)
2525
}
2626

2727
StringReference::StringReference(const VariableReference *str, const Expression *index)
28-
: VariableReference(TYPE_STRING),
28+
: VariableReference(TYPE_STRING, false),
2929
str(str),
3030
index(index),
3131
load(nullptr),
@@ -212,6 +212,9 @@ static const Statement *parseConstantDefinition(Scope *scope, const std::vector<
212212
if (value->type != type) {
213213
error(tokens[i], "type mismatch");
214214
}
215+
if (not value->is_constant) {
216+
error(tokens[i], "value must be constant");
217+
}
215218
scope->addName(name, new Constant(name, value));
216219
return nullptr;
217220
}

t/const-chain.simple

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CONST a: Number := 5
2+
CONST b: Number := a
3+
4+
print(str(b))
5+
6+
%= 5

t/const-notconst.simple

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
VAR a: Number
2+
CONST b: Number := a
3+
4+
%! value must be constant

0 commit comments

Comments
 (0)