Preparatory refactoring for const types.
1 /* vim: set ts=4 sw=4 tw=99 et:
3 * Copyright (C) 2012 David Anderson
5 * This file is part of SourcePawn.
7 * SourcePawn is free software: you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License as published by the Free
9 * Software Foundation, either version 3 of the License, or (at your option)
12 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
13 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with
17 * SourcePawn. If not, see http://www.gnu.org/licenses/.
19 #ifndef _include_sourcepawn_ast_h_
20 #define _include_sourcepawn_ast_h_
22 #include "../PoolAllocator.h"
23 #include "../Vector.h"
25 #include "NameBinding.h"
33 _(VariableDeclaration) \
43 _(ExpressionStatement) \
44 _(FunctionStatement) \
52 _(ContinueStatement) \
53 _(FunctionTypeStatement) \
56 _(TernaryExpression) \
58 _(StructureStatement) \
63 // Forward declarations.
64 #define _(name) class name;
70 // Interface for AST nodes.
71 class AstNode : public PoolObject
77 # define _(name) k##name,
83 AstNode(const SourcePosition &pos)
88 virtual Kind kind() const = 0;
90 #define _(name) bool is##name() { return kind() == k##name; } \
91 name *to##name() { assert(is##name()); return (name *)this; } \
92 name *as##name() { if (!is##name()) return NULL; return to##name(); }
96 virtual void accept(AstVisitor *visitor) = 0;
98 const SourcePosition &pos() const {
103 #define DECLARE_NODE(type) \
104 Kind kind() const { \
107 void accept(AstVisitor *visitor) { \
108 visitor->visit##type(this); \
114 #define _(name) virtual void visit##name(name *node) { assert(false); }
119 class Statement : public AstNode
122 Statement(const SourcePosition &pos)
128 class Expression : public AstNode
130 ScopedRoot<Type> type_;
133 Expression(const SourcePosition &pos)
139 void setType(Type *type) {
147 typedef PoolList<Statement *> StatementList;
148 typedef PoolList<Expression *> ExpressionList;
150 class VariableDeclaration : public Statement
152 TypeQualifiers qual_;
153 ScopedRoot<String> name_;
154 Expression *initialization_;
155 ExpressionList *dims_;
157 VariableSymbol *sym_;
160 VariableDeclaration(const SourcePosition &pos, TypeQualifiers qual, Handle<String> name,
161 Expression *type, ExpressionList *dims, Expression *initialization)
165 initialization_(initialization),
172 DECLARE_NODE(VariableDeclaration);
174 Expression *initialization() const {
175 return initialization_;
177 Handle<String> name() {
180 Expression *declType() const {
183 void setSymbol(VariableSymbol *sym) {
187 VariableSymbol *sym() const {
190 Expression *type() const {
193 ExpressionList *dims() const {
198 class Parameter : public PoolObject
200 ScopedRoot<String> name_;
204 Expression *initializer_;
205 VariableSymbol *sym_;
207 ExpressionList *dims_;
210 Parameter(Handle<String> name, Expression *type, bool reference, bool isConst,
211 ExpressionList *dims, Expression *initializer, const SourcePosition &pos)
214 reference_(reference),
216 initializer_(initializer),
223 Expression *type() const {
226 Handle<String> name() const {
229 bool reference() const {
232 bool isConst() const {
235 ExpressionList *dims() const {
238 Expression *initializer() const {
241 void setSymbol(VariableSymbol *sym) {
245 VariableSymbol *sym() const {
248 const SourcePosition &pos() const {
253 class NameProxy : public Expression
255 ScopedRoot<String> name_;
259 NameProxy(const SourcePosition &pos, Handle<String> name)
266 DECLARE_NODE(NameProxy);
268 Handle<String> name() const {
271 Symbol *sym() const {
274 void bind(Symbol *sym) {
279 class BooleanLiteral : public Expression
284 BooleanLiteral(const SourcePosition &pos, TokenKind token)
290 DECLARE_NODE(BooleanLiteral);
291 TokenKind token() const {
296 class IntegerLiteral : public Expression
301 IntegerLiteral(const SourcePosition &pos, int value)
307 DECLARE_NODE(IntegerLiteral);
314 class FloatLiteral : public Expression
319 FloatLiteral(const SourcePosition &pos, double value)
325 DECLARE_NODE(FloatLiteral);
327 double value() const {
332 class StringLiteral : public Expression
334 ScopedRoot<String> string_;
337 StringLiteral(const SourcePosition &pos, String *string)
343 DECLARE_NODE(StringLiteral);
345 String *string() const {
350 class ArrayLiteral : public Expression
353 ExpressionList *expressions_;
356 ArrayLiteral(const SourcePosition &pos, TokenKind token, ExpressionList *expressions)
359 expressions_(expressions)
363 DECLARE_NODE(ArrayLiteral);
365 TokenKind token() const {
368 ExpressionList *expressions() const {
371 bool isFixed() const {
372 return token_ == TOK_LBRACE;
376 class UnaryExpression : public Expression
378 Expression *expression_;
383 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
391 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
400 DECLARE_NODE(UnaryExpression);
402 Expression *expression() const {
405 TokenKind token() const {
408 NameProxy *tag() const {
413 class BinaryExpression : public Expression
420 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
428 DECLARE_NODE(BinaryExpression);
430 Expression *left() const {
433 Expression *right() const {
436 TokenKind token() const {
441 class TernaryExpression : public Expression
443 Expression *condition_;
448 TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
450 condition_(condition),
456 DECLARE_NODE(TernaryExpression);
458 Expression *condition() const {
461 Expression *left() const {
464 Expression *right() const {
469 class IndexExpression : public Expression
475 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
482 DECLARE_NODE(IndexExpression);
484 Expression *left() const {
487 Expression *right() const {
492 class FieldExpression : public Expression
495 ScopedRoot<String> field_;
496 unsigned fieldIndex_;
499 FieldExpression(const SourcePosition &pos, Expression *left, Handle<String> field)
503 fieldIndex_(unsigned(-1))
507 DECLARE_NODE(FieldExpression);
509 Expression *left() const {
512 String *field() const {
515 void setFieldIndex(unsigned index) {
516 assert(fieldIndex_ == unsigned(-1));
519 unsigned fieldIndex() const {
520 assert(fieldIndex_ != unsigned(-1));
525 class CallExpression : public Expression
528 ExpressionList *arguments_;
531 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
534 arguments_(arguments)
538 DECLARE_NODE(CallExpression);
540 Expression *callee() const {
543 ExpressionList *arguments() const {
548 class ForStatement : public Statement
550 Statement *initialization_;
551 Expression *condition_;
557 ForStatement(const SourcePosition &pos, Statement *initialization,
558 Expression *condition, Statement *update, Statement *body)
560 initialization_(initialization),
561 condition_(condition),
568 DECLARE_NODE(ForStatement);
570 Statement *initialization() const {
571 return initialization_;
573 Expression *condition() const {
576 Statement *update() const {
579 Statement *body() const {
582 Scope *scope() const {
585 void setScope(Scope *scope) {
590 class WhileStatement : public Statement
593 Expression *condition_;
597 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
600 condition_(condition),
605 DECLARE_NODE(WhileStatement);
607 TokenKind token() const {
610 Expression *condition() const {
613 Statement *body() const {
618 class ReturnStatement : public Statement
620 Expression *expression_;
623 ReturnStatement(const SourcePosition &pos, Expression *expression)
625 expression_(expression)
629 DECLARE_NODE(ReturnStatement);
631 Expression *expression() const {
636 class BreakStatement : public Statement
639 BreakStatement(const SourcePosition &pos)
644 DECLARE_NODE(BreakStatement);
647 class ContinueStatement : public Statement
650 ContinueStatement(const SourcePosition &pos)
655 DECLARE_NODE(ContinueStatement);
658 class Assignment : public Expression
662 Expression *expression_;
665 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
673 DECLARE_NODE(Assignment);
675 TokenKind token() const {
678 Expression *lvalue() const {
681 Expression *expression() const {
686 class ExpressionStatement : public Statement
688 Expression *expression_;
691 ExpressionStatement(Expression *expression)
692 : Statement(expression->pos()),
693 expression_(expression)
697 DECLARE_NODE(ExpressionStatement);
699 Expression *expression() const {
704 class BlockStatement : public Statement
706 StatementList *statements_;
710 BlockStatement(const SourcePosition &pos, StatementList *statements)
712 statements_(statements),
717 DECLARE_NODE(BlockStatement);
719 StatementList *statements() const {
722 Scope *scope() const {
725 void setScope(Scope *scope) {
730 typedef PoolList<Parameter *> ParameterList;
732 class FunctionSignature
735 FunctionSignature(Expression *returnType, ParameterList *parameters, bool variadic)
736 : returnType_(returnType),
737 parameters_(parameters),
742 Expression *returnType() const {
745 ParameterList *parameters() const {
748 bool variadic() const {
753 Expression *returnType_;
754 ParameterList *parameters_;
758 class FunctionTypeStatement : public Statement
761 FunctionTypeStatement(const SourcePosition &pos, Handle<String> name, const FunctionSignature &signature)
764 signature_(signature)
768 DECLARE_NODE(FunctionTypeStatement);
770 Handle<String> name() const {
773 const FunctionSignature &signature() const {
778 ScopedRoot<String> name_;
779 FunctionSignature signature_;
783 class FunctionStatement : public Statement
785 ScopedRoot<String> name_;
788 FunctionSignature signature_;
789 bool explicitReturn_;
790 FunctionSymbol *sym_;
795 FunctionStatement(const SourcePosition &pos, Handle<String> name, TokenKind kind,
796 Statement *body, const FunctionSignature &signature, bool explicitReturn)
801 signature_(signature),
802 explicitReturn_(explicitReturn),
809 DECLARE_NODE(FunctionStatement);
811 Handle<String> name() const {
814 Statement *body() const {
817 const FunctionSignature &signature() {
820 bool hasExplicitReturn() const {
821 return explicitReturn_;
823 TokenKind token() const {
826 void setSymbol(FunctionSymbol *sym) {
830 FunctionSymbol *sym() const {
833 void setScopes(Scope *argScope, Scope *varScope) {
834 argScope_ = argScope;
835 varScope_ = varScope;
837 Scope *argScope() const {
840 Scope *varScope() const {
845 class IfStatement : public Statement
847 Expression *condition_;
852 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
854 condition_(condition),
860 DECLARE_NODE(IfStatement);
862 Expression *condition() const {
865 Statement *ifTrue() const {
868 Statement *ifFalse() const {
871 void setIfFalse(Statement *ifFalse) {
876 class EnumStatement : public Statement
878 ScopedRoot<String> name_;
883 ScopedRoot<String> name;
887 Entry(Handle<String> name, Expression *expr, const SourcePosition &pos)
895 typedef PoolList<Entry> EntryList;
898 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
906 DECLARE_NODE(EnumStatement);
908 String *name() const {
911 EntryList *entries() const {
914 void setSymbol(TypeSymbol *sym) {
918 TypeSymbol *sym() const {
926 class IncDecExpression : public Expression
929 Expression *expression_;
933 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
936 expression_(expression),
941 DECLARE_NODE(IncDecExpression);
943 TokenKind token() const {
946 Expression *expression() const {
949 bool postfix() const {
954 class Case : public PoolObject
957 Case(Expression *expression, ExpressionList *others, Statement *statement)
958 : expression_(expression),
960 statement_(statement)
964 Expression *expression() const {
967 PoolList<Expression *> *others() const {
970 Statement *statement() const {
975 Expression *expression_;
976 PoolList <Expression *> *others_;
977 Statement *statement_;
985 CaseValue(size_t statement)
986 : statement(statement)
991 typedef PoolList<CaseValue> CaseValueList;
993 class SwitchStatement : public Statement
996 SwitchStatement(const SourcePosition &pos, Expression *expression, PoolList<Case *> *cases,
999 expression_(expression),
1006 DECLARE_NODE(SwitchStatement);
1008 Expression *expression() const {
1011 PoolList<Case *> *cases() const {
1014 Statement *defaultCase() const {
1017 void setCaseValueList(CaseValueList *list) {
1020 CaseValueList *caseValueList() const {
1025 Expression *expression_;
1026 PoolList<Case *> *cases_;
1027 Statement *default_;
1028 CaseValueList *table_;
1031 class StructureStatement : public Statement
1034 class Field : public PoolObject
1036 SourcePosition pos_;
1038 ScopedRoot<String> name_;
1041 Field(const SourcePosition &pos,
1043 Handle<String> name)
1050 const SourcePosition &pos() const {
1053 Handle<String> name() const {
1056 Expression *type() const {
1061 typedef PoolList<StructureStatement::Field *> FieldList;
1064 StructureStatement(const SourcePosition &pos, Handle<String> name, FieldList *fields)
1072 DECLARE_NODE(StructureStatement);
1074 FieldList *fields() const {
1077 Handle<String> name() const {
1080 void setSymbol(TypeSymbol *sym) {
1084 TypeSymbol *sym() const {
1089 ScopedRoot<String> name_;
1094 typedef PoolList<ScopedRoot<String> *> NameList;
1096 class ImportStatement : public Statement
1099 ImportStatement(const SourcePosition &pos, NameList *names, TokenKind suffix)
1107 DECLARE_NODE(ImportStatement);
1109 NameList *path() const {
1112 void setImportSource(TranslationUnit *unit) {
1115 TranslationUnit *source() const {
1118 TokenKind suffix() const {
1121 Handle<String> name() const {
1122 assert(suffix() != TOK_STAR);
1123 return *names_->at(names_->length() - 1);
1129 TranslationUnit *source_;
1132 typedef StructureStatement::FieldList FieldList;
1133 typedef PoolList<NameProxy *> NameProxyList;
1137 class ParseTree : public PoolObject
1139 StatementList *statements_;
1140 NameProxyList *unbound_;
1141 PoolList<ImportStatement *> *imports_;
1144 ParseTree(StatementList *statements, NameProxyList *unbound, PoolList<ImportStatement *> *imports)
1145 : statements_(statements),
1151 void dump(FILE *fp);
1153 StatementList *statements() const {
1156 NameProxyList *unbound() const {
1159 PoolList<ImportStatement *> *imports() const {
1166 #endif // _include_sourcepawn_ast_h_