Re-add enum support.
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_;
208 ExpressionList *dims_;
211 Parameter(Handle<String> name, Expression *type, bool reference, bool isConst,
212 ExpressionList *dims, Expression *initializer, const SourcePosition &pos)
215 reference_(reference),
217 initializer_(initializer),
224 Expression *type() const {
227 Handle<String> name() const {
230 bool reference() const {
233 bool isConst() const {
236 ExpressionList *dims() const {
239 Expression *initializer() const {
242 void setSymbol(VariableSymbol *sym) {
246 VariableSymbol *sym() const {
249 const SourcePosition &pos() const {
254 class NameProxy : public Expression
256 ScopedRoot<String> name_;
260 NameProxy(const SourcePosition &pos, Handle<String> name)
267 DECLARE_NODE(NameProxy);
269 Handle<String> name() const {
272 Symbol *sym() const {
275 void bind(Symbol *sym) {
280 class BooleanLiteral : public Expression
285 BooleanLiteral(const SourcePosition &pos, TokenKind token)
291 DECLARE_NODE(BooleanLiteral);
292 TokenKind token() const {
297 class IntegerLiteral : public Expression
302 IntegerLiteral(const SourcePosition &pos, int value)
308 DECLARE_NODE(IntegerLiteral);
315 class FloatLiteral : public Expression
320 FloatLiteral(const SourcePosition &pos, double value)
326 DECLARE_NODE(FloatLiteral);
328 double value() const {
333 class StringLiteral : public Expression
335 ScopedRoot<ByteArray> string_;
338 StringLiteral(const SourcePosition &pos, ByteArray *array)
344 DECLARE_NODE(StringLiteral);
346 ByteArray *string() const {
351 class ArrayLiteral : public Expression
354 ExpressionList *expressions_;
357 ArrayLiteral(const SourcePosition &pos, TokenKind token, ExpressionList *expressions)
360 expressions_(expressions)
364 DECLARE_NODE(ArrayLiteral);
366 TokenKind token() const {
369 ExpressionList *expressions() const {
372 bool isFixed() const {
373 return token_ == TOK_LBRACE;
377 class UnaryExpression : public Expression
379 Expression *expression_;
384 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
392 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
401 DECLARE_NODE(UnaryExpression);
403 Expression *expression() const {
406 TokenKind token() const {
409 NameProxy *tag() const {
414 class BinaryExpression : public Expression
421 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
429 DECLARE_NODE(BinaryExpression);
431 Expression *left() const {
434 Expression *right() const {
437 TokenKind token() const {
442 class TernaryExpression : public Expression
444 Expression *condition_;
449 TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
451 condition_(condition),
457 DECLARE_NODE(TernaryExpression);
459 Expression *condition() const {
462 Expression *left() const {
465 Expression *right() const {
470 class IndexExpression : public Expression
476 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
483 DECLARE_NODE(IndexExpression);
485 Expression *left() const {
488 Expression *right() const {
493 class FieldExpression : public Expression
496 ScopedRoot<String> field_;
497 unsigned fieldIndex_;
500 FieldExpression(const SourcePosition &pos, Expression *left, Handle<String> field)
504 fieldIndex_(unsigned(-1))
508 DECLARE_NODE(FieldExpression);
510 Expression *left() const {
513 String *field() const {
516 void setFieldIndex(unsigned index) {
517 assert(fieldIndex_ == unsigned(-1));
520 unsigned fieldIndex() const {
521 assert(fieldIndex_ != unsigned(-1));
526 class CallExpression : public Expression
529 ExpressionList *arguments_;
532 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
535 arguments_(arguments)
539 DECLARE_NODE(CallExpression);
541 Expression *callee() const {
544 ExpressionList *arguments() const {
549 class ForStatement : public Statement
551 Statement *initialization_;
552 Expression *condition_;
558 ForStatement(const SourcePosition &pos, Statement *initialization,
559 Expression *condition, Statement *update, Statement *body)
561 initialization_(initialization),
562 condition_(condition),
569 DECLARE_NODE(ForStatement);
571 Statement *initialization() const {
572 return initialization_;
574 Expression *condition() const {
577 Statement *update() const {
580 Statement *body() const {
583 Scope *scope() const {
586 void setScope(Scope *scope) {
591 class WhileStatement : public Statement
594 Expression *condition_;
598 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
601 condition_(condition),
606 DECLARE_NODE(WhileStatement);
608 TokenKind token() const {
611 Expression *condition() const {
614 Statement *body() const {
619 class ReturnStatement : public Statement
621 Expression *expression_;
624 ReturnStatement(const SourcePosition &pos, Expression *expression)
626 expression_(expression)
630 DECLARE_NODE(ReturnStatement);
632 Expression *expression() const {
637 class BreakStatement : public Statement
640 BreakStatement(const SourcePosition &pos)
645 DECLARE_NODE(BreakStatement);
648 class ContinueStatement : public Statement
651 ContinueStatement(const SourcePosition &pos)
656 DECLARE_NODE(ContinueStatement);
659 class Assignment : public Expression
663 Expression *expression_;
666 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
674 DECLARE_NODE(Assignment);
676 TokenKind token() const {
679 Expression *lvalue() const {
682 Expression *expression() const {
687 class ExpressionStatement : public Statement
689 Expression *expression_;
692 ExpressionStatement(Expression *expression)
693 : Statement(expression->pos()),
694 expression_(expression)
698 DECLARE_NODE(ExpressionStatement);
700 Expression *expression() const {
705 class BlockStatement : public Statement
707 StatementList *statements_;
711 BlockStatement(const SourcePosition &pos, StatementList *statements)
713 statements_(statements),
718 DECLARE_NODE(BlockStatement);
720 StatementList *statements() const {
723 Scope *scope() const {
726 void setScope(Scope *scope) {
731 typedef PoolList<Parameter *> ParameterList;
733 class FunctionSignature
736 FunctionSignature(Expression *returnType, ParameterList *parameters, bool variadic)
737 : returnType_(returnType),
738 parameters_(parameters),
743 Expression *returnType() const {
746 ParameterList *parameters() const {
749 bool variadic() const {
754 Expression *returnType_;
755 ParameterList *parameters_;
759 class FunctionTypeStatement : public Statement
762 FunctionTypeStatement(const SourcePosition &pos, Handle<String> name, const FunctionSignature &signature)
765 signature_(signature)
769 DECLARE_NODE(FunctionTypeStatement);
771 Handle<String> name() const {
774 const FunctionSignature &signature() const {
779 ScopedRoot<String> name_;
780 FunctionSignature signature_;
784 class FunctionStatement : public Statement
786 ScopedRoot<String> name_;
789 FunctionSignature signature_;
790 bool explicitReturn_;
791 FunctionSymbol *sym_;
796 FunctionStatement(const SourcePosition &pos, Handle<String> name, TokenKind kind,
797 Statement *body, const FunctionSignature &signature, bool explicitReturn)
802 signature_(signature),
803 explicitReturn_(explicitReturn),
810 DECLARE_NODE(FunctionStatement);
812 Handle<String> name() const {
815 Statement *body() const {
818 const FunctionSignature &signature() {
821 bool hasExplicitReturn() const {
822 return explicitReturn_;
824 TokenKind token() const {
827 void setSymbol(FunctionSymbol *sym) {
831 FunctionSymbol *sym() const {
834 void setScopes(Scope *argScope, Scope *varScope) {
835 argScope_ = argScope;
836 varScope_ = varScope;
838 Scope *argScope() const {
841 Scope *varScope() const {
846 class IfStatement : public Statement
848 Expression *condition_;
853 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
855 condition_(condition),
861 DECLARE_NODE(IfStatement);
863 Expression *condition() const {
866 Statement *ifTrue() const {
869 Statement *ifFalse() const {
872 void setIfFalse(Statement *ifFalse) {
877 class EnumStatement : public Statement
879 ScopedRoot<String> name_;
884 ScopedRoot<String> name;
888 Entry(Handle<String> name, Expression *expr, const SourcePosition &pos)
896 typedef PoolList<Entry> EntryList;
899 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
907 DECLARE_NODE(EnumStatement);
909 String *name() const {
912 EntryList *entries() const {
915 void setSymbol(TypeSymbol *sym) {
919 TypeSymbol *sym() const {
927 class IncDecExpression : public Expression
930 Expression *expression_;
934 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
937 expression_(expression),
942 DECLARE_NODE(IncDecExpression);
944 TokenKind token() const {
947 Expression *expression() const {
950 bool postfix() const {
955 class Case : public PoolObject
958 Case(Expression *expression, ExpressionList *others, Statement *statement)
959 : expression_(expression),
961 statement_(statement)
965 Expression *expression() const {
968 PoolList<Expression *> *others() const {
971 Statement *statement() const {
976 Expression *expression_;
977 PoolList <Expression *> *others_;
978 Statement *statement_;
986 CaseValue(size_t statement)
987 : statement(statement)
992 typedef PoolList<CaseValue> CaseValueList;
994 class SwitchStatement : public Statement
997 SwitchStatement(const SourcePosition &pos, Expression *expression, PoolList<Case *> *cases,
1000 expression_(expression),
1007 DECLARE_NODE(SwitchStatement);
1009 Expression *expression() const {
1012 PoolList<Case *> *cases() const {
1015 Statement *defaultCase() const {
1018 void setCaseValueList(CaseValueList *list) {
1021 CaseValueList *caseValueList() const {
1026 Expression *expression_;
1027 PoolList<Case *> *cases_;
1028 Statement *default_;
1029 CaseValueList *table_;
1032 class StructureStatement : public Statement
1035 class Field : public PoolObject
1037 SourcePosition pos_;
1039 ScopedRoot<String> name_;
1042 Field(const SourcePosition &pos,
1044 Handle<String> name)
1051 const SourcePosition &pos() const {
1054 Handle<String> name() const {
1057 Expression *type() const {
1062 typedef PoolList<StructureStatement::Field *> FieldList;
1065 StructureStatement(const SourcePosition &pos, Handle<String> name, FieldList *fields)
1073 DECLARE_NODE(StructureStatement);
1075 FieldList *fields() const {
1078 Handle<String> name() const {
1081 void setSymbol(TypeSymbol *sym) {
1085 TypeSymbol *sym() const {
1090 ScopedRoot<String> name_;
1095 typedef PoolList<ScopedRoot<String> *> NameList;
1097 class ImportStatement : public Statement
1100 ImportStatement(const SourcePosition &pos, NameList *names, TokenKind suffix)
1108 DECLARE_NODE(ImportStatement);
1110 NameList *path() const {
1113 void setImportSource(TranslationUnit *unit) {
1116 TranslationUnit *source() const {
1119 TokenKind suffix() const {
1122 Handle<String> name() const {
1123 assert(suffix() != TOK_STAR);
1124 return *names_->at(names_->length() - 1);
1130 TranslationUnit *source_;
1133 typedef StructureStatement::FieldList FieldList;
1134 typedef PoolList<NameProxy *> NameProxyList;
1138 class ParseTree : public PoolObject
1140 StatementList *statements_;
1141 NameProxyList *unbound_;
1142 PoolList<ImportStatement *> *imports_;
1145 ParseTree(StatementList *statements, NameProxyList *unbound, PoolList<ImportStatement *> *imports)
1146 : statements_(statements),
1152 void dump(FILE *fp);
1154 StatementList *statements() const {
1157 NameProxyList *unbound() const {
1160 PoolList<ImportStatement *> *imports() const {
1167 #endif // _include_sourcepawn_ast_h_