Fix linux/mac 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"
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 {
197 TypeQualifiers quals() const {
202 class Parameter : public PoolObject
204 ScopedRoot<String> name_;
207 Expression *initializer_;
208 VariableSymbol *sym_;
210 ExpressionList *dims_;
211 TypeQualifiers quals_;
214 Parameter(Handle<String> name, Expression *type, bool reference, TypeQualifiers quals,
215 ExpressionList *dims, Expression *initializer, const SourcePosition &pos)
218 reference_(reference),
219 initializer_(initializer),
227 Expression *type() const {
230 Handle<String> name() const {
233 bool reference() const {
236 TypeQualifiers quals() const {
239 ExpressionList *dims() const {
242 Expression *initializer() const {
245 void setSymbol(VariableSymbol *sym) {
249 VariableSymbol *sym() const {
252 const SourcePosition &pos() const {
257 class NameProxy : public Expression
259 ScopedRoot<String> name_;
263 NameProxy(const SourcePosition &pos, Handle<String> name)
270 DECLARE_NODE(NameProxy);
272 Handle<String> name() const {
275 Symbol *sym() const {
278 void bind(Symbol *sym) {
283 class BooleanLiteral : public Expression
288 BooleanLiteral(const SourcePosition &pos, TokenKind token)
294 DECLARE_NODE(BooleanLiteral);
295 TokenKind token() const {
300 class IntegerLiteral : public Expression
305 IntegerLiteral(const SourcePosition &pos, int value)
311 DECLARE_NODE(IntegerLiteral);
318 class FloatLiteral : public Expression
323 FloatLiteral(const SourcePosition &pos, double value)
329 DECLARE_NODE(FloatLiteral);
331 double value() const {
336 class StringLiteral : public Expression
338 ScopedRoot<String> string_;
341 StringLiteral(const SourcePosition &pos, String *string)
347 DECLARE_NODE(StringLiteral);
349 String *string() const {
354 class ArrayLiteral : public Expression
357 ExpressionList *expressions_;
360 ArrayLiteral(const SourcePosition &pos, TokenKind token, ExpressionList *expressions)
363 expressions_(expressions)
367 DECLARE_NODE(ArrayLiteral);
369 TokenKind token() const {
372 ExpressionList *expressions() const {
375 bool isFixed() const {
376 return token_ == TOK_LBRACE;
380 class UnaryExpression : public Expression
382 Expression *expression_;
387 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
395 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
404 DECLARE_NODE(UnaryExpression);
406 Expression *expression() const {
409 TokenKind token() const {
412 NameProxy *tag() const {
417 class BinaryExpression : public Expression
424 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
432 DECLARE_NODE(BinaryExpression);
434 Expression *left() const {
437 Expression *right() const {
440 TokenKind token() const {
445 class TernaryExpression : public Expression
447 Expression *condition_;
452 TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
454 condition_(condition),
460 DECLARE_NODE(TernaryExpression);
462 Expression *condition() const {
465 Expression *left() const {
468 Expression *right() const {
473 class IndexExpression : public Expression
479 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
486 DECLARE_NODE(IndexExpression);
488 Expression *left() const {
491 Expression *right() const {
496 class FieldExpression : public Expression
499 ScopedRoot<String> field_;
500 unsigned fieldIndex_;
503 FieldExpression(const SourcePosition &pos, Expression *left, Handle<String> field)
507 fieldIndex_(unsigned(-1))
511 DECLARE_NODE(FieldExpression);
513 Expression *left() const {
516 String *field() const {
519 void setFieldIndex(unsigned index) {
520 assert(fieldIndex_ == unsigned(-1));
523 unsigned fieldIndex() const {
524 assert(fieldIndex_ != unsigned(-1));
529 class CallExpression : public Expression
532 ExpressionList *arguments_;
535 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
538 arguments_(arguments)
542 DECLARE_NODE(CallExpression);
544 Expression *callee() const {
547 ExpressionList *arguments() const {
552 class ForStatement : public Statement
554 Statement *initialization_;
555 Expression *condition_;
561 ForStatement(const SourcePosition &pos, Statement *initialization,
562 Expression *condition, Statement *update, Statement *body)
564 initialization_(initialization),
565 condition_(condition),
572 DECLARE_NODE(ForStatement);
574 Statement *initialization() const {
575 return initialization_;
577 Expression *condition() const {
580 Statement *update() const {
583 Statement *body() const {
586 Scope *scope() const {
589 void setScope(Scope *scope) {
594 class WhileStatement : public Statement
597 Expression *condition_;
601 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
604 condition_(condition),
609 DECLARE_NODE(WhileStatement);
611 TokenKind token() const {
614 Expression *condition() const {
617 Statement *body() const {
622 class ReturnStatement : public Statement
624 Expression *expression_;
627 ReturnStatement(const SourcePosition &pos, Expression *expression)
629 expression_(expression)
633 DECLARE_NODE(ReturnStatement);
635 Expression *expression() const {
640 class BreakStatement : public Statement
643 BreakStatement(const SourcePosition &pos)
648 DECLARE_NODE(BreakStatement);
651 class ContinueStatement : public Statement
654 ContinueStatement(const SourcePosition &pos)
659 DECLARE_NODE(ContinueStatement);
662 class Assignment : public Expression
666 Expression *expression_;
669 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
677 DECLARE_NODE(Assignment);
679 TokenKind token() const {
682 Expression *lvalue() const {
685 Expression *expression() const {
690 class ExpressionStatement : public Statement
692 Expression *expression_;
695 ExpressionStatement(Expression *expression)
696 : Statement(expression->pos()),
697 expression_(expression)
701 DECLARE_NODE(ExpressionStatement);
703 Expression *expression() const {
708 class BlockStatement : public Statement
710 StatementList *statements_;
715 BlockStatement(const SourcePosition &pos, StatementList *statements, TokenKind kind)
717 statements_(statements),
723 DECLARE_NODE(BlockStatement);
725 StatementList *statements() const {
728 Scope *scope() const {
731 void setScope(Scope *scope) {
734 TokenKind type() const {
739 typedef PoolList<Parameter *> ParameterList;
741 class FunctionSignature
744 FunctionSignature(Expression *returnType, ParameterList *parameters, bool variadic)
745 : returnType_(returnType),
746 parameters_(parameters),
751 Expression *returnType() const {
754 ParameterList *parameters() const {
757 bool variadic() const {
762 Expression *returnType_;
763 ParameterList *parameters_;
767 class FunctionTypeStatement : public Statement
770 FunctionTypeStatement(const SourcePosition &pos, Handle<String> name, const FunctionSignature &signature)
773 signature_(signature)
777 DECLARE_NODE(FunctionTypeStatement);
779 Handle<String> name() const {
782 const FunctionSignature &signature() const {
787 ScopedRoot<String> name_;
788 FunctionSignature signature_;
792 class FunctionStatement : public Statement
794 ScopedRoot<String> name_;
797 FunctionSignature signature_;
798 bool explicitReturn_;
799 FunctionSymbol *sym_;
804 FunctionStatement(const SourcePosition &pos, Handle<String> name, TokenKind kind,
805 Statement *body, const FunctionSignature &signature, bool explicitReturn)
810 signature_(signature),
811 explicitReturn_(explicitReturn),
818 DECLARE_NODE(FunctionStatement);
820 Handle<String> name() const {
823 Statement *body() const {
826 const FunctionSignature &signature() {
829 bool hasExplicitReturn() const {
830 return explicitReturn_;
832 TokenKind token() const {
835 void setSymbol(FunctionSymbol *sym) {
839 FunctionSymbol *sym() const {
842 void setScopes(Scope *argScope, Scope *varScope) {
843 argScope_ = argScope;
844 varScope_ = varScope;
846 Scope *argScope() const {
849 Scope *varScope() const {
854 class IfStatement : public Statement
856 Expression *condition_;
861 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
863 condition_(condition),
869 DECLARE_NODE(IfStatement);
871 Expression *condition() const {
874 Statement *ifTrue() const {
877 Statement *ifFalse() const {
880 void setIfFalse(Statement *ifFalse) {
885 class EnumStatement : public Statement
887 ScopedRoot<String> name_;
892 ScopedRoot<String> name;
896 Entry(Handle<String> name, Expression *expr, const SourcePosition &pos)
904 typedef PoolList<Entry> EntryList;
907 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
915 DECLARE_NODE(EnumStatement);
917 String *name() const {
920 EntryList *entries() const {
923 void setSymbol(TypeSymbol *sym) {
927 TypeSymbol *sym() const {
935 class IncDecExpression : public Expression
938 Expression *expression_;
942 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
945 expression_(expression),
950 DECLARE_NODE(IncDecExpression);
952 TokenKind token() const {
955 Expression *expression() const {
958 bool postfix() const {
963 class Case : public PoolObject
966 Case(Expression *expression, ExpressionList *others, Statement *statement)
967 : expression_(expression),
969 statement_(statement)
973 Expression *expression() const {
976 PoolList<Expression *> *others() const {
979 Statement *statement() const {
984 Expression *expression_;
985 PoolList <Expression *> *others_;
986 Statement *statement_;
994 CaseValue(size_t statement)
995 : statement(statement)
1000 typedef PoolList<CaseValue> CaseValueList;
1002 class SwitchStatement : public Statement
1005 SwitchStatement(const SourcePosition &pos, Expression *expression, PoolList<Case *> *cases,
1008 expression_(expression),
1015 DECLARE_NODE(SwitchStatement);
1017 Expression *expression() const {
1020 PoolList<Case *> *cases() const {
1023 Statement *defaultCase() const {
1026 void setCaseValueList(CaseValueList *list) {
1029 CaseValueList *caseValueList() const {
1034 Expression *expression_;
1035 PoolList<Case *> *cases_;
1036 Statement *default_;
1037 CaseValueList *table_;
1040 class StructureStatement : public Statement
1043 class Field : public PoolObject
1045 SourcePosition pos_;
1047 ScopedRoot<String> name_;
1050 Field(const SourcePosition &pos,
1052 Handle<String> name)
1059 const SourcePosition &pos() const {
1062 Handle<String> name() const {
1065 Expression *type() const {
1070 typedef PoolList<StructureStatement::Field *> FieldList;
1073 StructureStatement(const SourcePosition &pos, Handle<String> name, FieldList *fields)
1081 DECLARE_NODE(StructureStatement);
1083 FieldList *fields() const {
1086 Handle<String> name() const {
1089 void setSymbol(TypeSymbol *sym) {
1093 TypeSymbol *sym() const {
1098 ScopedRoot<String> name_;
1103 typedef PoolList<ScopedRoot<String> *> NameList;
1105 class ImportStatement : public Statement
1108 ImportStatement(const SourcePosition &pos, PathComponent *path, TokenKind suffix)
1116 DECLARE_NODE(ImportStatement);
1118 PathComponent *path() const {
1121 void setImportSource(TranslationUnit *unit) {
1124 TranslationUnit *source() const {
1127 TokenKind suffix() const {
1132 PathComponent *path_;
1134 TranslationUnit *source_;
1137 typedef StructureStatement::FieldList FieldList;
1138 typedef PoolList<NameProxy *> NameProxyList;
1142 class ParseTree : public PoolObject
1144 StatementList *statements_;
1145 NameProxyList *unbound_;
1146 PoolList<ImportStatement *> *imports_;
1149 ParseTree(StatementList *statements, NameProxyList *unbound, PoolList<ImportStatement *> *imports)
1150 : statements_(statements),
1156 void dump(FILE *fp);
1158 StatementList *statements() const {
1161 NameProxyList *unbound() const {
1164 PoolList<ImportStatement *> *imports() const {
1171 #endif // _include_sourcepawn_ast_h_