Added array support back.
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"
27 #include "../QualType.h"
34 _(VariableDeclaration) \
44 _(ExpressionStatement) \
45 _(FunctionStatement) \
53 _(ContinueStatement) \
54 _(FunctionTypeStatement) \
57 _(TernaryExpression) \
59 _(StructureStatement) \
64 // Forward declarations.
65 #define _(name) class name;
71 // Interface for AST nodes.
72 class AstNode : public PoolObject
78 # define _(name) k##name,
84 AstNode(const SourcePosition &pos)
89 virtual Kind kind() const = 0;
91 #define _(name) bool is##name() { return kind() == k##name; } \
92 name *to##name() { assert(is##name()); return (name *)this; } \
93 name *as##name() { if (!is##name()) return NULL; return to##name(); }
97 virtual void accept(AstVisitor *visitor) = 0;
99 const SourcePosition &pos() const {
104 #define DECLARE_NODE(type) \
105 Kind kind() const { \
108 void accept(AstVisitor *visitor) { \
109 visitor->visit##type(this); \
115 #define _(name) virtual void visit##name(name *node) { assert(false); }
120 class Statement : public AstNode
123 Statement(const SourcePosition &pos)
129 class Expression : public AstNode
131 ScopedRoot<Type> type_;
134 Expression(const SourcePosition &pos)
140 void setType(Type *type) {
148 typedef PoolList<Statement *> StatementList;
149 typedef PoolList<Expression *> ExpressionList;
151 class VariableDeclaration : public Statement
153 TypeQualifiers qual_;
154 ScopedRoot<String> name_;
155 Expression *initialization_;
156 ExpressionList *dims_;
158 VariableSymbol *sym_;
161 VariableDeclaration(const SourcePosition &pos, TypeQualifiers qual, Handle<String> name,
162 Expression *type, ExpressionList *dims, Expression *initialization)
166 initialization_(initialization),
173 DECLARE_NODE(VariableDeclaration);
175 Expression *initialization() const {
176 return initialization_;
178 Handle<String> name() {
181 Expression *declType() const {
184 void setSymbol(VariableSymbol *sym) {
188 VariableSymbol *sym() const {
191 Expression *type() const {
194 ExpressionList *dims() const {
199 class Parameter : public PoolObject
201 ScopedRoot<String> name_;
205 Expression *initializer_;
206 VariableSymbol *sym_;
210 Parameter(Handle<String> name, Expression *type, bool reference, bool isConst,
211 Expression *initializer, const SourcePosition &pos)
214 reference_(reference),
216 initializer_(initializer),
222 Expression *type() const {
225 Handle<String> name() const {
228 bool reference() const {
231 bool isConst() const {
234 Expression *initializer() const {
237 void setSymbol(VariableSymbol *sym) {
241 VariableSymbol *sym() const {
244 const SourcePosition &pos() const {
249 class NameProxy : public Expression
251 ScopedRoot<String> name_;
255 NameProxy(const SourcePosition &pos, Handle<String> name)
262 DECLARE_NODE(NameProxy);
264 Handle<String> name() const {
267 Symbol *sym() const {
270 void bind(Symbol *sym) {
275 class BooleanLiteral : public Expression
280 BooleanLiteral(const SourcePosition &pos, TokenKind token)
286 DECLARE_NODE(BooleanLiteral);
287 TokenKind token() const {
292 class IntegerLiteral : public Expression
297 IntegerLiteral(const SourcePosition &pos, int value)
303 DECLARE_NODE(IntegerLiteral);
310 class FloatLiteral : public Expression
315 FloatLiteral(const SourcePosition &pos, double value)
321 DECLARE_NODE(FloatLiteral);
323 double value() const {
328 class StringLiteral : public Expression
330 ScopedRoot<ByteArray> string_;
333 StringLiteral(const SourcePosition &pos, ByteArray *array)
339 DECLARE_NODE(StringLiteral);
341 ByteArray *string() const {
346 class ArrayLiteral : public Expression
349 ExpressionList *expressions_;
352 ArrayLiteral(const SourcePosition &pos, TokenKind token, ExpressionList *expressions)
355 expressions_(expressions)
359 DECLARE_NODE(ArrayLiteral);
361 TokenKind token() const {
364 ExpressionList *expressions() const {
367 bool isFixed() const {
368 return token_ == TOK_LBRACE;
372 class UnaryExpression : public Expression
374 Expression *expression_;
379 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
387 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
396 DECLARE_NODE(UnaryExpression);
398 Expression *expression() const {
401 TokenKind token() const {
404 NameProxy *tag() const {
409 class BinaryExpression : public Expression
416 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
424 DECLARE_NODE(BinaryExpression);
426 Expression *left() const {
429 Expression *right() const {
432 TokenKind token() const {
437 class TernaryExpression : public Expression
439 Expression *condition_;
444 TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
446 condition_(condition),
452 DECLARE_NODE(TernaryExpression);
454 Expression *condition() const {
457 Expression *left() const {
460 Expression *right() const {
465 class IndexExpression : public Expression
471 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
478 DECLARE_NODE(IndexExpression);
480 Expression *left() const {
483 Expression *right() const {
488 class FieldExpression : public Expression
491 ScopedRoot<String> field_;
492 unsigned fieldIndex_;
495 FieldExpression(const SourcePosition &pos, Expression *left, Handle<String> field)
499 fieldIndex_(unsigned(-1))
503 DECLARE_NODE(FieldExpression);
505 Expression *left() const {
508 String *field() const {
511 void setFieldIndex(unsigned index) {
512 assert(fieldIndex_ == unsigned(-1));
515 unsigned fieldIndex() const {
516 assert(fieldIndex_ != unsigned(-1));
521 class CallExpression : public Expression
524 ExpressionList *arguments_;
527 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
530 arguments_(arguments)
534 DECLARE_NODE(CallExpression);
536 Expression *callee() const {
539 ExpressionList *arguments() const {
544 class ForStatement : public Statement
546 Statement *initialization_;
547 Expression *condition_;
553 ForStatement(const SourcePosition &pos, Statement *initialization,
554 Expression *condition, Statement *update, Statement *body)
556 initialization_(initialization),
557 condition_(condition),
564 DECLARE_NODE(ForStatement);
566 Statement *initialization() const {
567 return initialization_;
569 Expression *condition() const {
572 Statement *update() const {
575 Statement *body() const {
578 Scope *scope() const {
581 void setScope(Scope *scope) {
586 class WhileStatement : public Statement
589 Expression *condition_;
593 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
596 condition_(condition),
601 DECLARE_NODE(WhileStatement);
603 TokenKind token() const {
606 Expression *condition() const {
609 Statement *body() const {
614 class ReturnStatement : public Statement
616 Expression *expression_;
619 ReturnStatement(const SourcePosition &pos, Expression *expression)
621 expression_(expression)
625 DECLARE_NODE(ReturnStatement);
627 Expression *expression() const {
632 class BreakStatement : public Statement
635 BreakStatement(const SourcePosition &pos)
640 DECLARE_NODE(BreakStatement);
643 class ContinueStatement : public Statement
646 ContinueStatement(const SourcePosition &pos)
651 DECLARE_NODE(ContinueStatement);
654 class Assignment : public Expression
658 Expression *expression_;
661 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
669 DECLARE_NODE(Assignment);
671 TokenKind token() const {
674 Expression *lvalue() const {
677 Expression *expression() const {
682 class ExpressionStatement : public Statement
684 Expression *expression_;
687 ExpressionStatement(Expression *expression)
688 : Statement(expression->pos()),
689 expression_(expression)
693 DECLARE_NODE(ExpressionStatement);
695 Expression *expression() const {
700 class BlockStatement : public Statement
702 StatementList *statements_;
706 BlockStatement(const SourcePosition &pos, StatementList *statements)
708 statements_(statements),
713 DECLARE_NODE(BlockStatement);
715 StatementList *statements() const {
718 Scope *scope() const {
721 void setScope(Scope *scope) {
726 typedef PoolList<Parameter *> ParameterList;
728 class FunctionSignature
731 FunctionSignature(Expression *returnType, ParameterList *parameters, bool variadic)
732 : returnType_(returnType),
733 parameters_(parameters),
738 Expression *returnType() const {
741 ParameterList *parameters() const {
744 bool variadic() const {
749 Expression *returnType_;
750 ParameterList *parameters_;
754 class FunctionTypeStatement : public Statement
757 FunctionTypeStatement(const SourcePosition &pos, Handle<String> name, const FunctionSignature &signature)
760 signature_(signature)
764 DECLARE_NODE(FunctionTypeStatement);
766 Handle<String> name() const {
769 const FunctionSignature &signature() const {
774 ScopedRoot<String> name_;
775 FunctionSignature signature_;
779 class FunctionStatement : public Statement
781 ScopedRoot<String> name_;
784 FunctionSignature signature_;
785 bool explicitReturn_;
786 FunctionSymbol *sym_;
791 FunctionStatement(const SourcePosition &pos, Handle<String> name, TokenKind kind,
792 Statement *body, const FunctionSignature &signature, bool explicitReturn)
797 signature_(signature),
798 explicitReturn_(explicitReturn),
805 DECLARE_NODE(FunctionStatement);
807 Handle<String> name() const {
810 Statement *body() const {
813 const FunctionSignature &signature() {
816 bool hasExplicitReturn() const {
817 return explicitReturn_;
819 TokenKind token() const {
822 void setSymbol(FunctionSymbol *sym) {
826 FunctionSymbol *sym() const {
829 void setScopes(Scope *argScope, Scope *varScope) {
830 argScope_ = argScope;
831 varScope_ = varScope;
833 Scope *argScope() const {
836 Scope *varScope() const {
841 class IfStatement : public Statement
843 Expression *condition_;
848 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
850 condition_(condition),
856 DECLARE_NODE(IfStatement);
858 Expression *condition() const {
861 Statement *ifTrue() const {
864 Statement *ifFalse() const {
867 void setIfFalse(Statement *ifFalse) {
872 class EnumStatement : public Statement
874 ScopedRoot<String> name_;
879 ScopedRoot<String> name;
882 Entry(Handle<String> name, Expression *expr)
889 typedef PoolList<Entry> EntryList;
892 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
900 DECLARE_NODE(EnumStatement);
902 String *name() const {
905 EntryList *entries() const {
908 void setSymbol(TypeSymbol *sym) {
912 TypeSymbol *sym() const {
920 class IncDecExpression : public Expression
923 Expression *expression_;
927 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
930 expression_(expression),
935 DECLARE_NODE(IncDecExpression);
937 TokenKind token() const {
940 Expression *expression() const {
943 bool postfix() const {
948 class Case : public PoolObject
951 Case(Expression *expression, ExpressionList *others, Statement *statement)
952 : expression_(expression),
954 statement_(statement)
958 Expression *expression() const {
961 PoolList<Expression *> *others() const {
964 Statement *statement() const {
969 Expression *expression_;
970 PoolList <Expression *> *others_;
971 Statement *statement_;
979 CaseValue(size_t statement)
980 : statement(statement)
985 typedef PoolList<CaseValue> CaseValueList;
987 class SwitchStatement : public Statement
990 SwitchStatement(const SourcePosition &pos, Expression *expression, PoolList<Case *> *cases,
993 expression_(expression),
1000 DECLARE_NODE(SwitchStatement);
1002 Expression *expression() const {
1005 PoolList<Case *> *cases() const {
1008 Statement *defaultCase() const {
1011 void setCaseValueList(CaseValueList *list) {
1014 CaseValueList *caseValueList() const {
1019 Expression *expression_;
1020 PoolList<Case *> *cases_;
1021 Statement *default_;
1022 CaseValueList *table_;
1025 class StructureStatement : public Statement
1028 class Field : public PoolObject
1030 SourcePosition pos_;
1032 ScopedRoot<String> name_;
1035 Field(const SourcePosition &pos,
1037 Handle<String> name)
1044 const SourcePosition &pos() const {
1047 Handle<String> name() const {
1050 Expression *type() const {
1055 typedef PoolList<StructureStatement::Field *> FieldList;
1058 StructureStatement(const SourcePosition &pos, Handle<String> name, FieldList *fields)
1066 DECLARE_NODE(StructureStatement);
1068 FieldList *fields() const {
1071 Handle<String> name() const {
1074 void setSymbol(TypeSymbol *sym) {
1078 TypeSymbol *sym() const {
1083 ScopedRoot<String> name_;
1088 typedef PoolList<ScopedRoot<String> *> NameList;
1090 class ImportStatement : public Statement
1093 ImportStatement(const SourcePosition &pos, NameList *names, TokenKind suffix)
1101 DECLARE_NODE(ImportStatement);
1103 NameList *path() const {
1106 void setImportSource(TranslationUnit *unit) {
1109 TranslationUnit *source() const {
1112 TokenKind suffix() const {
1115 Handle<String> name() const {
1116 assert(suffix() != TOK_STAR);
1117 return *names_->at(names_->length() - 1);
1123 TranslationUnit *source_;
1126 typedef StructureStatement::FieldList FieldList;
1127 typedef PoolList<NameProxy *> NameProxyList;
1131 class ParseTree : public PoolObject
1133 StatementList *statements_;
1134 NameProxyList *unbound_;
1135 PoolList<ImportStatement *> *imports_;
1138 ParseTree(StatementList *statements, NameProxyList *unbound, PoolList<ImportStatement *> *imports)
1139 : statements_(statements),
1145 void dump(FILE *fp);
1147 StatementList *statements() const {
1150 NameProxyList *unbound() const {
1153 PoolList<ImportStatement *> *imports() const {
1160 #endif // _include_sourcepawn_ast_h_