Fix Linux build problems.
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_;
157 VariableSymbol *sym_;
160 VariableDeclaration(const SourcePosition &pos, TypeQualifiers qual, Handle<String> name,
161 Expression *type, Expression *initialization)
165 initialization_(initialization),
171 DECLARE_NODE(VariableDeclaration);
173 Expression *initialization() const {
174 return initialization_;
176 Handle<String> name() {
179 Expression *declType() const {
182 void setSymbol(VariableSymbol *sym) {
186 VariableSymbol *sym() const {
189 Expression *type() const {
194 class Parameter : public PoolObject
196 ScopedRoot<String> name_;
200 Expression *initializer_;
201 VariableSymbol *sym_;
205 Parameter(Handle<String> name, Expression *type, bool reference, bool isConst,
206 Expression *initializer, const SourcePosition &pos)
209 reference_(reference),
211 initializer_(initializer),
217 Expression *type() const {
220 Handle<String> name() const {
223 bool reference() const {
226 bool isConst() const {
229 Expression *initializer() const {
232 void setSymbol(VariableSymbol *sym) {
236 VariableSymbol *sym() const {
239 const SourcePosition &pos() const {
244 class NameProxy : public Expression
246 ScopedRoot<String> name_;
250 NameProxy(const SourcePosition &pos, Handle<String> name)
257 DECLARE_NODE(NameProxy);
259 Handle<String> name() const {
262 Symbol *sym() const {
265 void bind(Symbol *sym) {
270 class BooleanLiteral : public Expression
275 BooleanLiteral(const SourcePosition &pos, TokenKind token)
281 DECLARE_NODE(BooleanLiteral);
282 TokenKind token() const {
287 class IntegerLiteral : public Expression
292 IntegerLiteral(const SourcePosition &pos, int value)
298 DECLARE_NODE(IntegerLiteral);
305 class FloatLiteral : public Expression
310 FloatLiteral(const SourcePosition &pos, double value)
316 DECLARE_NODE(FloatLiteral);
318 double value() const {
323 class StringLiteral : public Expression
325 ScopedRoot<ByteArray> string_;
328 StringLiteral(const SourcePosition &pos, ByteArray *array)
334 DECLARE_NODE(StringLiteral);
336 ByteArray *string() const {
341 class ArrayLiteral : public Expression
344 ExpressionList *expressions_;
347 ArrayLiteral(const SourcePosition &pos, TokenKind token, ExpressionList *expressions)
350 expressions_(expressions)
354 DECLARE_NODE(ArrayLiteral);
356 TokenKind token() const {
359 ExpressionList *expressions() const {
362 bool isFixed() const {
363 return token_ == TOK_LBRACE;
367 class UnaryExpression : public Expression
369 Expression *expression_;
374 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
382 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
391 DECLARE_NODE(UnaryExpression);
393 Expression *expression() const {
396 TokenKind token() const {
399 NameProxy *tag() const {
404 class BinaryExpression : public Expression
411 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
419 DECLARE_NODE(BinaryExpression);
421 Expression *left() const {
424 Expression *right() const {
427 TokenKind token() const {
432 class TernaryExpression : public Expression
434 Expression *condition_;
439 TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
441 condition_(condition),
447 DECLARE_NODE(TernaryExpression);
449 Expression *condition() const {
452 Expression *left() const {
455 Expression *right() const {
460 class IndexExpression : public Expression
466 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
473 DECLARE_NODE(IndexExpression);
475 Expression *left() const {
478 Expression *right() const {
483 class FieldExpression : public Expression
486 ScopedRoot<String> field_;
487 unsigned fieldIndex_;
490 FieldExpression(const SourcePosition &pos, Expression *left, Handle<String> field)
494 fieldIndex_(unsigned(-1))
498 DECLARE_NODE(FieldExpression);
500 Expression *left() const {
503 String *field() const {
506 void setFieldIndex(unsigned index) {
507 assert(fieldIndex_ == unsigned(-1));
510 unsigned fieldIndex() const {
511 assert(fieldIndex_ != unsigned(-1));
516 class CallExpression : public Expression
519 ExpressionList *arguments_;
522 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
525 arguments_(arguments)
529 DECLARE_NODE(CallExpression);
531 Expression *callee() const {
534 ExpressionList *arguments() const {
539 class ForStatement : public Statement
541 Statement *initialization_;
542 Expression *condition_;
548 ForStatement(const SourcePosition &pos, Statement *initialization,
549 Expression *condition, Statement *update, Statement *body)
551 initialization_(initialization),
552 condition_(condition),
559 DECLARE_NODE(ForStatement);
561 Statement *initialization() const {
562 return initialization_;
564 Expression *condition() const {
567 Statement *update() const {
570 Statement *body() const {
573 Scope *scope() const {
576 void setScope(Scope *scope) {
581 class WhileStatement : public Statement
584 Expression *condition_;
588 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
591 condition_(condition),
596 DECLARE_NODE(WhileStatement);
598 TokenKind token() const {
601 Expression *condition() const {
604 Statement *body() const {
609 class ReturnStatement : public Statement
611 Expression *expression_;
614 ReturnStatement(const SourcePosition &pos, Expression *expression)
616 expression_(expression)
620 DECLARE_NODE(ReturnStatement);
622 Expression *expression() const {
627 class BreakStatement : public Statement
630 BreakStatement(const SourcePosition &pos)
635 DECLARE_NODE(BreakStatement);
638 class ContinueStatement : public Statement
641 ContinueStatement(const SourcePosition &pos)
646 DECLARE_NODE(ContinueStatement);
649 class Assignment : public Expression
653 Expression *expression_;
656 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
664 DECLARE_NODE(Assignment);
666 TokenKind token() const {
669 Expression *lvalue() const {
672 Expression *expression() const {
677 class ExpressionStatement : public Statement
679 Expression *expression_;
682 ExpressionStatement(Expression *expression)
683 : Statement(expression->pos()),
684 expression_(expression)
688 DECLARE_NODE(ExpressionStatement);
690 Expression *expression() const {
695 class BlockStatement : public Statement
697 StatementList *statements_;
701 BlockStatement(const SourcePosition &pos, StatementList *statements)
703 statements_(statements),
708 DECLARE_NODE(BlockStatement);
710 StatementList *statements() const {
713 Scope *scope() const {
716 void setScope(Scope *scope) {
721 typedef PoolList<Parameter *> ParameterList;
723 class FunctionSignature
726 FunctionSignature(Expression *returnType, ParameterList *parameters, bool variadic)
727 : returnType_(returnType),
728 parameters_(parameters),
733 Expression *returnType() const {
736 ParameterList *parameters() const {
739 bool variadic() const {
744 Expression *returnType_;
745 ParameterList *parameters_;
749 class FunctionTypeStatement : public Statement
752 FunctionTypeStatement(const SourcePosition &pos, Handle<String> name, const FunctionSignature &signature)
755 signature_(signature)
759 DECLARE_NODE(FunctionTypeStatement);
761 Handle<String> name() const {
764 const FunctionSignature &signature() const {
769 ScopedRoot<String> name_;
770 FunctionSignature signature_;
774 class FunctionStatement : public Statement
776 ScopedRoot<String> name_;
779 FunctionSignature signature_;
780 bool explicitReturn_;
781 FunctionSymbol *sym_;
786 FunctionStatement(const SourcePosition &pos, Handle<String> name, TokenKind kind,
787 Statement *body, const FunctionSignature &signature, bool explicitReturn)
792 signature_(signature),
793 explicitReturn_(explicitReturn),
800 DECLARE_NODE(FunctionStatement);
802 Handle<String> name() const {
805 Statement *body() const {
808 const FunctionSignature &signature() {
811 bool hasExplicitReturn() const {
812 return explicitReturn_;
814 TokenKind token() const {
817 void setSymbol(FunctionSymbol *sym) {
821 FunctionSymbol *sym() const {
824 void setScopes(Scope *argScope, Scope *varScope) {
825 argScope_ = argScope;
826 varScope_ = varScope;
828 Scope *argScope() const {
831 Scope *varScope() const {
836 class IfStatement : public Statement
838 Expression *condition_;
843 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
845 condition_(condition),
851 DECLARE_NODE(IfStatement);
853 Expression *condition() const {
856 Statement *ifTrue() const {
859 Statement *ifFalse() const {
862 void setIfFalse(Statement *ifFalse) {
867 class EnumStatement : public Statement
869 ScopedRoot<String> name_;
874 ScopedRoot<String> name;
877 Entry(Handle<String> name, Expression *expr)
884 typedef PoolList<Entry> EntryList;
887 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
895 DECLARE_NODE(EnumStatement);
897 String *name() const {
900 EntryList *entries() const {
903 void setSymbol(TypeSymbol *sym) {
907 TypeSymbol *sym() const {
915 class IncDecExpression : public Expression
918 Expression *expression_;
922 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
925 expression_(expression),
930 DECLARE_NODE(IncDecExpression);
932 TokenKind token() const {
935 Expression *expression() const {
938 bool postfix() const {
943 class Case : public PoolObject
946 Case(Expression *expression, ExpressionList *others, Statement *statement)
947 : expression_(expression),
949 statement_(statement)
953 Expression *expression() const {
956 PoolList<Expression *> *others() const {
959 Statement *statement() const {
964 Expression *expression_;
965 PoolList <Expression *> *others_;
966 Statement *statement_;
974 CaseValue(size_t statement)
975 : statement(statement)
980 typedef PoolList<CaseValue> CaseValueList;
982 class SwitchStatement : public Statement
985 SwitchStatement(const SourcePosition &pos, Expression *expression, PoolList<Case *> *cases,
988 expression_(expression),
995 DECLARE_NODE(SwitchStatement);
997 Expression *expression() const {
1000 PoolList<Case *> *cases() const {
1003 Statement *defaultCase() const {
1006 void setCaseValueList(CaseValueList *list) {
1009 CaseValueList *caseValueList() const {
1014 Expression *expression_;
1015 PoolList<Case *> *cases_;
1016 Statement *default_;
1017 CaseValueList *table_;
1020 class StructureStatement : public Statement
1023 class Field : public PoolObject
1025 SourcePosition pos_;
1027 ScopedRoot<String> name_;
1030 Field(const SourcePosition &pos,
1032 Handle<String> name)
1039 const SourcePosition &pos() const {
1042 Handle<String> name() const {
1045 Expression *type() const {
1050 typedef PoolList<StructureStatement::Field *> FieldList;
1053 StructureStatement(const SourcePosition &pos, Handle<String> name, FieldList *fields)
1061 DECLARE_NODE(StructureStatement);
1063 FieldList *fields() const {
1066 Handle<String> name() const {
1069 void setSymbol(TypeSymbol *sym) {
1073 TypeSymbol *sym() const {
1078 ScopedRoot<String> name_;
1083 typedef PoolList<ScopedRoot<String> *> NameList;
1085 class ImportStatement : public Statement
1088 ImportStatement(const SourcePosition &pos, NameList *names, TokenKind suffix)
1096 DECLARE_NODE(ImportStatement);
1098 NameList *path() const {
1101 void setImportSource(TranslationUnit *unit) {
1104 TranslationUnit *source() const {
1107 TokenKind suffix() const {
1110 Handle<String> name() const {
1111 assert(suffix() != TOK_STAR);
1112 return *names_->at(names_->length() - 1);
1118 TranslationUnit *source_;
1121 typedef StructureStatement::FieldList FieldList;
1122 typedef PoolList<NameProxy *> NameProxyList;
1126 class ParseTree : public PoolObject
1128 StatementList *statements_;
1129 NameProxyList *unbound_;
1130 PoolList<ImportStatement *> *imports_;
1133 ParseTree(StatementList *statements, NameProxyList *unbound, PoolList<ImportStatement *> *imports)
1134 : statements_(statements),
1140 void dump(FILE *fp);
1142 StatementList *statements() const {
1145 NameProxyList *unbound() const {
1148 PoolList<ImportStatement *> *imports() const {
1155 #endif // _include_sourcepawn_ast_h_