All but interpreter support for getting and setting struct fields.
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) \
49 _(ContinueStatement) \
52 _(TernaryExpression) \
56 // Forward declarations.
57 #define _(name) class name;
63 // Interface for AST nodes.
64 class AstNode : public PoolObject
70 # define _(name) k##name,
76 AstNode(const SourcePosition &pos)
81 virtual Kind kind() const = 0;
83 #define _(name) bool is##name() { return kind() == k##name; } \
84 name *to##name() { assert(is##name()); return (name *)this; }
88 virtual void accept(AstVisitor *visitor) = 0;
90 const SourcePosition &pos() const {
98 #define _(name) virtual void visit(name *node) = 0;
103 class Statement : public AstNode
106 Statement(const SourcePosition &pos)
112 class Expression : public AstNode
114 ScopedRoot<Type> type_;
117 Expression(const SourcePosition &pos)
123 void setType(Type *type) {
131 typedef PoolList<Statement *> StatementList;
132 typedef PoolList<Expression *> ExpressionList;
134 class VariableDeclaration : public Statement
137 Expression *initialization_;
138 ExpressionList *postDimensions_;
140 TokenKind declarator_;
143 VariableDeclaration(const SourcePosition &pos, TokenKind declarator, Variable *var,
144 BoundName *type, ExpressionList *postDimensions,
145 Expression *initialization)
148 initialization_(initialization),
149 postDimensions_(postDimensions),
151 declarator_(declarator)
155 BoundName *type() const {
159 return kVariableDeclaration;
161 Variable *variable() const {
164 Expression *initialization() const {
165 return initialization_;
167 ExpressionList *postDimensions() const {
168 return postDimensions_;
170 void accept(AstVisitor *visitor) {
171 visitor->visit(this);
173 TokenKind declarator() const {
178 class Parameter : public PoolObject
184 ExpressionList *dimensions_;
185 Expression *initializer_;
188 Parameter(Variable *var, BoundName *type, bool reference, bool isConst,
189 ExpressionList *dimensions, Expression *initializer)
192 reference_(reference),
194 dimensions_(dimensions),
195 initializer_(initializer)
199 BoundName *type() const {
202 Variable *variable() const {
205 bool reference() const {
208 ExpressionList *dimensions() const {
211 bool isConst() const {
214 Expression *initializer() const {
219 class NameProxy : public Expression
221 ScopedRoot<String> name_;
225 NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
235 String *name() const {
238 void accept(AstVisitor *visitor) {
239 visitor->visit(this);
241 BoundName *binding() const {
244 void bind(BoundName *name) {
250 class BooleanLiteral : public Expression
255 BooleanLiteral(const SourcePosition &pos, TokenKind token)
262 return kBooleanLiteral;
264 TokenKind token() const {
267 void accept(AstVisitor *visitor) {
268 visitor->visit(this);
272 class IntegerLiteral : public Expression
277 IntegerLiteral(const SourcePosition &pos, int value)
284 return kIntegerLiteral;
289 void accept(AstVisitor *visitor) {
290 visitor->visit(this);
294 class FloatLiteral : public Expression
299 FloatLiteral(const SourcePosition &pos, double value)
306 return kFloatLiteral;
308 double value() const {
311 void accept(AstVisitor *visitor) {
312 visitor->visit(this);
316 class StringLiteral : public Expression
318 ScopedRoot<ByteArray> string_;
321 StringLiteral(const SourcePosition &pos, ByteArray *array)
328 return kStringLiteral;
330 ByteArray *string() const {
333 void accept(AstVisitor *visitor) {
334 visitor->visit(this);
338 class UnaryExpression : public Expression
340 Expression *expression_;
345 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
352 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
362 return kUnaryExpression;
364 Expression *expression() const {
367 TokenKind token() const {
370 BoundName *type() const {
373 void accept(AstVisitor *visitor) {
374 visitor->visit(this);
378 class BinaryExpression : public Expression
385 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
394 return kBinaryExpression;
396 Expression *left() const {
399 Expression *right() const {
402 TokenKind token() const {
405 void accept(AstVisitor *visitor) {
406 visitor->visit(this);
410 class TernaryExpression : public Expression
412 Expression *condition_;
417 TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
419 condition_(condition),
426 return kTernaryExpression;
428 Expression *condition() const {
431 Expression *left() const {
434 Expression *right() const {
437 void accept(AstVisitor *visitor) {
438 visitor->visit(this);
442 class IndexExpression : public Expression
448 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
456 return kIndexExpression;
458 Expression *left() const {
461 Expression *right() const {
464 void accept(AstVisitor *visitor) {
465 visitor->visit(this);
469 class FieldExpression : public Expression
472 ScopedRoot<String> field_;
473 unsigned fieldIndex_;
476 FieldExpression(const SourcePosition &pos, Expression *left, Handle<String> field)
480 fieldIndex_(unsigned(-1))
485 return kFieldExpression;
487 Expression *left() const {
490 String *field() const {
493 void setFieldIndex(unsigned index) {
494 assert(fieldIndex_ == unsigned(-1));
497 unsigned fieldIndex() const {
498 assert(fieldIndex_ != unsigned(-1));
501 void accept(AstVisitor *visitor) {
502 visitor->visit(this);
506 class CallExpression : public Expression
509 ExpressionList *arguments_;
512 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
515 arguments_(arguments)
520 return kCallExpression;
522 Expression *callee() const {
525 ExpressionList *arguments() const {
528 void accept(AstVisitor *visitor) {
529 visitor->visit(this);
533 class ForStatement : public Statement
536 Statement *initialization_;
537 Expression *condition_;
542 ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
543 Expression *condition, Statement *update, Statement *body)
546 initialization_(initialization),
547 condition_(condition),
554 return kForStatement;
556 Statement *initialization() const {
557 return initialization_;
559 Scope *scope() const {
562 Expression *condition() const {
565 Statement *update() const {
568 Statement *body() const {
571 void accept(AstVisitor *visitor) {
572 visitor->visit(this);
576 class WhileStatement : public Statement
579 Expression *condition_;
583 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
586 condition_(condition),
592 return kWhileStatement;
594 TokenKind token() const {
597 Expression *condition() const {
600 Statement *body() const {
603 void accept(AstVisitor *visitor) {
604 visitor->visit(this);
608 class ReturnStatement : public Statement
610 Expression *expression_;
613 ReturnStatement(const SourcePosition &pos, Expression *expression)
615 expression_(expression)
620 return kReturnStatement;
622 Expression *expression() const {
625 void accept(AstVisitor *visitor) {
626 visitor->visit(this);
630 class BreakStatement : public Statement
633 BreakStatement(const SourcePosition &pos)
639 return kBreakStatement;
641 void accept(AstVisitor *visitor) {
642 visitor->visit(this);
646 class ContinueStatement : public Statement
649 ContinueStatement(const SourcePosition &pos)
655 return kContinueStatement;
657 void accept(AstVisitor *visitor) {
658 visitor->visit(this);
662 class Assignment : public Expression
666 Expression *expression_;
669 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
680 TokenKind token() const {
683 Expression *lvalue() const {
686 Expression *expression() const {
689 void accept(AstVisitor *visitor) {
690 visitor->visit(this);
694 class ExpressionStatement : public Statement
696 Expression *expression_;
699 ExpressionStatement(Expression *expression)
700 : Statement(expression->pos()),
701 expression_(expression)
706 return kExpressionStatement;
708 Expression *expression() const {
711 void accept(AstVisitor *visitor) {
712 visitor->visit(this);
716 class BlockStatement : public Statement
719 StatementList *statements_;
722 BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
725 statements_(statements)
730 return kBlockStatement;
732 Scope *scope() const {
735 StatementList *statements() const {
738 void accept(AstVisitor *visitor) {
739 visitor->visit(this);
743 typedef PoolList<Parameter *> ParameterList;
745 class FunctionStatement : public Statement
750 ParameterList *parameters_;
751 bool explicitReturn_;
752 BoundName *returnType_;
755 FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
756 ParameterList *parameters, BoundName *returnType, bool explicitReturn)
761 parameters_(parameters),
762 explicitReturn_(explicitReturn),
763 returnType_(returnType)
768 return kFunctionStatement;
770 Scope *scope() const {
773 NamedFunction *fun() const {
776 Statement *body() const {
779 ParameterList *parameters() const {
782 void accept(AstVisitor *visitor) {
783 visitor->visit(this);
785 bool hasExplicitReturn() const {
786 return explicitReturn_;
788 BoundName *returnType() const {
793 class IfStatement : public Statement
795 Expression *condition_;
800 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
802 condition_(condition),
811 Expression *condition() const {
814 Statement *ifTrue() const {
817 Statement *ifFalse() const {
820 void setIfFalse(Statement *ifFalse) {
823 void accept(AstVisitor *visitor) {
824 visitor->visit(this);
828 class EnumStatement : public Statement
830 ScopedRoot<String> name_;
838 Entry(NamedConstant *name, Expression *expr)
845 typedef PoolList<Entry> EntryList;
848 EnumStatement(const SourcePosition &pos, NamedType *type, Handle<String> name, EntryList *entries)
857 return kEnumStatement;
859 String *name() const {
862 EntryList *entries() const {
865 NamedType *decl() const {
868 void accept(AstVisitor *visitor) {
869 visitor->visit(this);
876 class IncDecExpression : public Expression
879 Expression *expression_;
883 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
886 expression_(expression),
892 return kIncDecExpression;
894 TokenKind token() const {
897 Expression *expression() const {
900 bool postfix() const {
903 void accept(AstVisitor *visitor) {
904 visitor->visit(this);
908 class StructureStatement : public Statement
911 class Field : public PoolObject
915 ScopedRoot<String> name_;
916 ExpressionList *dimensions_;
919 Field(const SourcePosition &pos,
922 ExpressionList *dimensions)
926 dimensions_(dimensions)
930 const SourcePosition &pos() const {
933 BoundName *type() const {
936 String *name() const {
939 ExpressionList *dimensions() const {
944 typedef PoolList<StructureStatement::Field *> FieldList;
947 StructureStatement(const SourcePosition &pos, NamedType *decl, FieldList *fields)
955 return kStructureStatement;
957 FieldList *fields() const {
960 NamedType *decl() const {
963 void accept(AstVisitor *visitor) {
964 visitor->visit(this);
972 typedef StructureStatement::FieldList FieldList;
976 typedef PoolList<NameProxy *> NameProxyList;
978 class ParseTree : public PoolObject
980 StatementList *statements_;
982 NameProxyList *unbound_;
985 ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
986 : statements_(statements),
994 StatementList *statements() const {
997 Scope *scope() const {
1000 NameProxyList *unbound() const {
1007 #endif // _include_jitcraft_ast_h_