Structure declaration 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_jitcraft_ast_h_
20 #define _include_jitcraft_ast_h_
22 #include "PoolAllocator.h"
24 #include "NameBinding.h"
30 _(VariableDeclaration) \
40 _(ExpressionStatement) \
41 _(FunctionStatement) \
48 _(ContinueStatement) \
51 _(TernaryExpression) \
55 // Forward declarations.
56 #define _(name) class name;
62 // Interface for AST nodes.
63 class AstNode : public PoolObject
69 # define _(name) k##name,
75 AstNode(const SourcePosition &pos)
80 virtual Kind kind() const = 0;
82 #define _(name) bool is##name() { return kind() == k##name; } \
83 name *to##name() { assert(is##name()); return (name *)this; }
87 virtual void accept(AstVisitor *visitor) = 0;
89 const SourcePosition &pos() const {
97 #define _(name) virtual void visit(name *node) = 0;
102 class Statement : public AstNode
105 Statement(const SourcePosition &pos)
111 class Expression : public AstNode
113 ScopedRoot<Type> type_;
116 Expression(const SourcePosition &pos)
122 void setType(Type *type) {
130 typedef PoolList<Statement *> StatementList;
131 typedef PoolList<Expression *> ExpressionList;
133 class VariableDeclaration : public Statement
136 Expression *initialization_;
137 ExpressionList *postDimensions_;
139 TokenKind declarator_;
142 VariableDeclaration(const SourcePosition &pos, TokenKind declarator, Variable *var,
143 BoundName *type, ExpressionList *postDimensions,
144 Expression *initialization)
147 initialization_(initialization),
148 postDimensions_(postDimensions),
150 declarator_(declarator)
154 BoundName *type() const {
158 return kVariableDeclaration;
160 Variable *variable() const {
163 Expression *initialization() const {
164 return initialization_;
166 ExpressionList *postDimensions() const {
167 return postDimensions_;
169 void accept(AstVisitor *visitor) {
170 visitor->visit(this);
172 TokenKind declarator() const {
177 class Parameter : public PoolObject
183 ExpressionList *dimensions_;
184 Expression *initializer_;
187 Parameter(Variable *var, BoundName *type, bool reference, bool isConst,
188 ExpressionList *dimensions, Expression *initializer)
191 reference_(reference),
193 dimensions_(dimensions),
194 initializer_(initializer)
198 BoundName *type() const {
201 Variable *variable() const {
204 bool reference() const {
207 ExpressionList *dimensions() const {
210 bool isConst() const {
213 Expression *initializer() const {
218 class NameProxy : public Expression
220 ScopedRoot<String> name_;
224 NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
234 String *name() const {
237 void accept(AstVisitor *visitor) {
238 visitor->visit(this);
240 BoundName *binding() const {
243 void bind(BoundName *name) {
249 class BooleanLiteral : public Expression
254 BooleanLiteral(const SourcePosition &pos, TokenKind token)
261 return kBooleanLiteral;
263 TokenKind token() const {
266 void accept(AstVisitor *visitor) {
267 visitor->visit(this);
271 class IntegerLiteral : public Expression
276 IntegerLiteral(const SourcePosition &pos, int value)
283 return kIntegerLiteral;
288 void accept(AstVisitor *visitor) {
289 visitor->visit(this);
293 class FloatLiteral : public Expression
298 FloatLiteral(const SourcePosition &pos, double value)
305 return kFloatLiteral;
307 double value() const {
310 void accept(AstVisitor *visitor) {
311 visitor->visit(this);
315 class StringLiteral : public Expression
317 ScopedRoot<ByteArray> string_;
320 StringLiteral(const SourcePosition &pos, ByteArray *array)
327 return kStringLiteral;
329 ByteArray *string() const {
332 void accept(AstVisitor *visitor) {
333 visitor->visit(this);
337 class UnaryExpression : public Expression
339 Expression *expression_;
344 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
351 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
361 return kUnaryExpression;
363 Expression *expression() const {
366 TokenKind token() const {
369 BoundName *type() const {
372 void accept(AstVisitor *visitor) {
373 visitor->visit(this);
377 class BinaryExpression : public Expression
384 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
393 return kBinaryExpression;
395 Expression *left() const {
398 Expression *right() const {
401 TokenKind token() const {
404 void accept(AstVisitor *visitor) {
405 visitor->visit(this);
409 class TernaryExpression : public Expression
411 Expression *condition_;
416 TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
418 condition_(condition),
425 return kTernaryExpression;
427 Expression *condition() const {
430 Expression *left() const {
433 Expression *right() const {
436 void accept(AstVisitor *visitor) {
437 visitor->visit(this);
441 class IndexExpression : public Expression
447 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
455 return kIndexExpression;
457 Expression *left() const {
460 Expression *right() const {
463 void accept(AstVisitor *visitor) {
464 visitor->visit(this);
468 class CallExpression : public Expression
471 ExpressionList *arguments_;
474 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
477 arguments_(arguments)
482 return kCallExpression;
484 Expression *callee() const {
487 ExpressionList *arguments() const {
490 void accept(AstVisitor *visitor) {
491 visitor->visit(this);
495 class ForStatement : public Statement
498 Statement *initialization_;
499 Expression *condition_;
504 ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
505 Expression *condition, Statement *update, Statement *body)
508 initialization_(initialization),
509 condition_(condition),
516 return kForStatement;
518 Statement *initialization() const {
519 return initialization_;
521 Scope *scope() const {
524 Expression *condition() const {
527 Statement *update() const {
530 Statement *body() const {
533 void accept(AstVisitor *visitor) {
534 visitor->visit(this);
538 class WhileStatement : public Statement
541 Expression *condition_;
545 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
548 condition_(condition),
554 return kWhileStatement;
556 TokenKind token() const {
559 Expression *condition() const {
562 Statement *body() const {
565 void accept(AstVisitor *visitor) {
566 visitor->visit(this);
570 class ReturnStatement : public Statement
572 Expression *expression_;
575 ReturnStatement(const SourcePosition &pos, Expression *expression)
577 expression_(expression)
582 return kReturnStatement;
584 Expression *expression() const {
587 void accept(AstVisitor *visitor) {
588 visitor->visit(this);
592 class BreakStatement : public Statement
595 BreakStatement(const SourcePosition &pos)
601 return kBreakStatement;
603 void accept(AstVisitor *visitor) {
604 visitor->visit(this);
608 class ContinueStatement : public Statement
611 ContinueStatement(const SourcePosition &pos)
617 return kContinueStatement;
619 void accept(AstVisitor *visitor) {
620 visitor->visit(this);
624 class Assignment : public Expression
628 Expression *expression_;
631 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
642 TokenKind token() const {
645 Expression *lvalue() const {
648 Expression *expression() const {
651 void accept(AstVisitor *visitor) {
652 visitor->visit(this);
656 class ExpressionStatement : public Statement
658 Expression *expression_;
661 ExpressionStatement(Expression *expression)
662 : Statement(expression->pos()),
663 expression_(expression)
668 return kExpressionStatement;
670 Expression *expression() const {
673 void accept(AstVisitor *visitor) {
674 visitor->visit(this);
678 class BlockStatement : public Statement
681 StatementList *statements_;
684 BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
687 statements_(statements)
692 return kBlockStatement;
694 Scope *scope() const {
697 StatementList *statements() const {
700 void accept(AstVisitor *visitor) {
701 visitor->visit(this);
705 typedef PoolList<Parameter *> ParameterList;
707 class FunctionStatement : public Statement
712 ParameterList *parameters_;
713 bool explicitReturn_;
714 BoundName *returnType_;
717 FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
718 ParameterList *parameters, BoundName *returnType, bool explicitReturn)
723 parameters_(parameters),
724 explicitReturn_(explicitReturn),
725 returnType_(returnType)
730 return kFunctionStatement;
732 Scope *scope() const {
735 NamedFunction *fun() const {
738 Statement *body() const {
741 ParameterList *parameters() const {
744 void accept(AstVisitor *visitor) {
745 visitor->visit(this);
747 bool hasExplicitReturn() const {
748 return explicitReturn_;
750 BoundName *returnType() const {
755 class IfStatement : public Statement
757 Expression *condition_;
762 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
764 condition_(condition),
773 Expression *condition() const {
776 Statement *ifTrue() const {
779 Statement *ifFalse() const {
782 void setIfFalse(Statement *ifFalse) {
785 void accept(AstVisitor *visitor) {
786 visitor->visit(this);
790 class EnumStatement : public Statement
792 ScopedRoot<String> name_;
800 Entry(NamedConstant *name, Expression *expr)
807 typedef PoolList<Entry> EntryList;
810 EnumStatement(const SourcePosition &pos, NamedType *type, Handle<String> name, EntryList *entries)
819 return kEnumStatement;
821 String *name() const {
824 EntryList *entries() const {
827 NamedType *decl() const {
830 void accept(AstVisitor *visitor) {
831 visitor->visit(this);
838 class IncDecExpression : public Expression
841 Expression *expression_;
845 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
848 expression_(expression),
854 return kIncDecExpression;
856 TokenKind token() const {
859 Expression *expression() const {
862 bool postfix() const {
865 void accept(AstVisitor *visitor) {
866 visitor->visit(this);
870 class StructureStatement : public Statement
873 class Field : public PoolObject
877 ScopedRoot<String> name_;
878 ExpressionList *dimensions_;
881 Field(const SourcePosition &pos,
884 ExpressionList *dimensions)
888 dimensions_(dimensions)
892 const SourcePosition &pos() const {
895 BoundName *type() const {
898 String *name() const {
901 ExpressionList *dimensions() const {
906 typedef PoolList<StructureStatement::Field *> FieldList;
909 StructureStatement(const SourcePosition &pos, NamedType *decl, FieldList *fields)
917 return kStructureStatement;
919 FieldList *fields() const {
922 NamedType *decl() const {
925 void accept(AstVisitor *visitor) {
926 visitor->visit(this);
934 typedef StructureStatement::FieldList FieldList;
938 typedef PoolList<NameProxy *> NameProxyList;
940 class ParseTree : public PoolObject
942 StatementList *statements_;
944 NameProxyList *unbound_;
947 ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
948 : statements_(statements),
956 StatementList *statements() const {
959 Scope *scope() const {
962 NameProxyList *unbound() const {
969 #endif // _include_jitcraft_ast_h_