Add support for passing arrays.
2 * Copyright (C) 2012 David Anderson
4 * This file is part of JITCraft.
6 * JITCraft is free software: you can redistribute it and/or modify it under
7 * the terms of the GNU General Public License as published by the Free
8 * Software Foundation, either version 3 of the License, or (at your option)
11 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along with
16 * JITCraft. If not, see http://www.gnu.org/licenses/.
18 #ifndef _include_jitcraft_ast_h_
19 #define _include_jitcraft_ast_h_
21 #include "PoolAllocator.h"
23 #include "NameBinding.h"
29 _(VariableDeclaration) \
39 _(ExpressionStatement) \
40 _(FunctionStatement) \
47 _(ContinueStatement) \
50 // Forward declarations.
51 #define _(name) class name;
57 // Interface for AST nodes.
58 class AstNode : public PoolObject
64 # define _(name) k##name,
70 AstNode(const SourcePosition &pos)
75 virtual Kind kind() const = 0;
77 #define _(name) bool is##name() { return kind() == k##name; } \
78 name *to##name() { assert(is##name()); return (name *)this; }
82 virtual void accept(AstVisitor *visitor) = 0;
84 const SourcePosition &pos() const {
92 #define _(name) virtual void visit(name *node) = 0;
104 static NameLocation Local(VariableDeclaration *decl) {
115 VariableDeclaration *local() const {
116 assert(kind() == LOCAL);
123 VariableDeclaration *decl;
127 class Statement : public AstNode
130 Statement(const SourcePosition &pos)
136 class Expression : public AstNode
138 ScopedRoot<Type> type_;
141 Expression(const SourcePosition &pos)
147 void setType(Type *type) {
155 typedef PoolList<Statement *> StatementList;
156 typedef PoolList<Expression *> ExpressionList;
158 class VariableDeclaration : public Statement
161 Expression *initialization_;
162 ExpressionList *postDimensions_;
163 ScopedRoot<String> tag_;
166 VariableDeclaration(const SourcePosition &pos, Variable *var, Handle<String> tag,
167 ExpressionList *postDimensions, Expression *initialization)
170 initialization_(initialization),
171 postDimensions_(postDimensions),
176 String *tag() const {
180 return kVariableDeclaration;
182 Variable *variable() const {
185 Expression *initialization() const {
186 return initialization_;
188 ExpressionList *postDimensions() const {
189 return postDimensions_;
191 void accept(AstVisitor *visitor) {
192 visitor->visit(this);
196 class Parameter : public PoolObject
199 ScopedRoot<String> tag_;
201 ExpressionList *dimensions_;
204 Parameter(Variable *var, Handle<String> tag, bool reference, ExpressionList *dimensions)
207 reference_(reference),
208 dimensions_(dimensions)
212 String *tag() const {
215 Variable *variable() const {
218 bool reference() const {
221 ExpressionList *dimensions() const {
226 class NameProxy : public Expression
228 ScopedRoot<String> name_;
232 NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
242 String *name() const {
245 void accept(AstVisitor *visitor) {
246 visitor->visit(this);
248 BoundName *binding() const {
251 void bind(BoundName *name) {
257 class IntegerLiteral : public Expression
262 IntegerLiteral(const SourcePosition &pos, int value)
269 return kIntegerLiteral;
274 void accept(AstVisitor *visitor) {
275 visitor->visit(this);
279 class FloatLiteral : public Expression
284 FloatLiteral(const SourcePosition &pos, double value)
291 return kFloatLiteral;
293 double value() const {
296 void accept(AstVisitor *visitor) {
297 visitor->visit(this);
301 class StringLiteral : public Expression
303 ScopedRoot<ByteArray> string_;
306 StringLiteral(const SourcePosition &pos, ByteArray *array)
313 return kStringLiteral;
315 ByteArray *string() const {
318 void accept(AstVisitor *visitor) {
319 visitor->visit(this);
323 class BinaryExpression : public Expression
330 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
339 return kBinaryExpression;
341 Expression *left() const {
344 Expression *right() const {
347 TokenKind token() const {
350 void accept(AstVisitor *visitor) {
351 visitor->visit(this);
355 class IndexExpression : public Expression
361 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
369 return kIndexExpression;
371 Expression *left() const {
374 Expression *right() const {
377 void accept(AstVisitor *visitor) {
378 visitor->visit(this);
382 class CallExpression : public Expression
385 ExpressionList *arguments_;
388 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
391 arguments_(arguments)
396 return kCallExpression;
398 Expression *callee() const {
401 ExpressionList *arguments() const {
404 void accept(AstVisitor *visitor) {
405 visitor->visit(this);
409 class ForStatement : public Statement
412 Statement *initialization_;
413 Expression *condition_;
418 ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
419 Expression *condition, Statement *update, Statement *body)
422 initialization_(initialization),
423 condition_(condition),
430 return kForStatement;
432 Statement *initialization() const {
433 return initialization_;
435 Scope *scope() const {
438 Expression *condition() const {
441 Statement *update() const {
444 Statement *body() const {
447 void accept(AstVisitor *visitor) {
448 visitor->visit(this);
452 class WhileStatement : public Statement
455 Expression *condition_;
459 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
462 condition_(condition),
468 return kWhileStatement;
470 TokenKind token() const {
473 Expression *condition() const {
476 Statement *body() const {
479 void accept(AstVisitor *visitor) {
480 visitor->visit(this);
484 class ReturnStatement : public Statement
486 Expression *expression_;
489 ReturnStatement(const SourcePosition &pos, Expression *expression)
491 expression_(expression)
496 return kReturnStatement;
498 Expression *expression() const {
501 void accept(AstVisitor *visitor) {
502 visitor->visit(this);
506 class BreakStatement : public Statement
509 BreakStatement(const SourcePosition &pos)
515 return kBreakStatement;
517 void accept(AstVisitor *visitor) {
518 visitor->visit(this);
522 class ContinueStatement : public Statement
525 ContinueStatement(const SourcePosition &pos)
531 return kContinueStatement;
533 void accept(AstVisitor *visitor) {
534 visitor->visit(this);
538 class Assignment : public Expression
542 Expression *expression_;
545 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
556 TokenKind token() const {
559 Expression *lvalue() const {
562 Expression *expression() const {
565 void accept(AstVisitor *visitor) {
566 visitor->visit(this);
570 class ExpressionStatement : public Statement
572 Expression *expression_;
575 ExpressionStatement(Expression *expression)
576 : Statement(expression->pos()),
577 expression_(expression)
582 return kExpressionStatement;
584 Expression *expression() const {
587 void accept(AstVisitor *visitor) {
588 visitor->visit(this);
592 class BlockStatement : public Statement
595 StatementList *statements_;
598 BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
601 statements_(statements)
606 return kBlockStatement;
608 Scope *scope() const {
611 StatementList *statements() const {
614 void accept(AstVisitor *visitor) {
615 visitor->visit(this);
619 typedef PoolList<Parameter *> ParameterList;
621 class FunctionStatement : public Statement
626 ParameterList *parameters_;
629 FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
630 ParameterList *parameters)
635 parameters_(parameters)
640 return kFunctionStatement;
642 Scope *scope() const {
645 NamedFunction *fun() const {
648 Statement *body() const {
651 ParameterList *parameters() const {
654 void accept(AstVisitor *visitor) {
655 visitor->visit(this);
659 class IfStatement : public Statement
661 Expression *condition_;
666 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
668 condition_(condition),
677 Expression *condition() const {
680 Statement *ifTrue() const {
683 Statement *ifFalse() const {
686 void setIfFalse(Statement *ifFalse) {
689 void accept(AstVisitor *visitor) {
690 visitor->visit(this);
694 class EnumStatement : public Statement
696 ScopedRoot<String> name_;
703 Entry(NamedConstant *name, Expression *expr)
710 typedef PoolList<Entry> EntryList;
713 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
721 return kEnumStatement;
723 String *name() const {
726 EntryList *entries() const {
729 void accept(AstVisitor *visitor) {
730 visitor->visit(this);
737 class IncDecExpression : public Expression
740 Expression *expression_;
744 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
747 expression_(expression),
753 return kIncDecExpression;
755 TokenKind token() const {
758 Expression *expression() const {
761 bool postfix() const {
764 void accept(AstVisitor *visitor) {
765 visitor->visit(this);
771 typedef PoolList<NameProxy *> NameProxyList;
773 class ParseTree : public PoolObject
775 StatementList *statements_;
777 NameProxyList *unbound_;
780 ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
781 : statements_(statements),
789 StatementList *statements() const {
792 Scope *scope() const {
795 NameProxyList *unbound() const {
802 #endif // _include_jitcraft_ast_h_