Move ExpressionList to a jc::Vector.
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"
30 _(VariableDeclaration) \
40 _(ExpressionStatement) \
41 _(FunctionStatement) \
48 _(ContinueStatement) \
51 // Forward declarations.
52 #define _(name) class name;
58 // Interface for AST nodes.
59 class AstNode : public PoolObject
65 # define _(name) k##name,
71 AstNode(const SourcePosition &pos)
76 virtual Kind kind() const = 0;
78 #define _(name) bool is##name() { return kind() == k##name; } \
79 name *to##name() { assert(is##name()); return (name *)this; }
83 virtual void accept(AstVisitor *visitor) = 0;
85 const SourcePosition &pos() const {
93 #define _(name) virtual void visit(name *node) = 0;
105 static NameLocation Local(VariableDeclaration *decl) {
116 VariableDeclaration *local() const {
117 assert(kind() == LOCAL);
124 VariableDeclaration *decl;
128 class Statement : public AstNode
131 Statement(const SourcePosition &pos)
137 class Expression : public AstNode
139 ScopedRoot<Type> type_;
142 Expression(const SourcePosition &pos)
148 void setType(Type *type) {
156 typedef PoolList<Statement *> StatementList;
157 typedef Vector<Expression *, PoolAllocationPolicy> ExpressionList;
159 class VariableDeclaration : public Statement
162 Expression *initialization_;
163 ExpressionList *postDimensions_;
164 ScopedRoot<String> tag_;
167 VariableDeclaration(const SourcePosition &pos, Variable *var, Handle<String> tag,
168 ExpressionList *postDimensions, Expression *initialization)
171 initialization_(initialization),
172 postDimensions_(postDimensions),
177 String *tag() const {
181 return kVariableDeclaration;
183 Variable *variable() const {
186 Expression *initialization() const {
187 return initialization_;
189 ExpressionList *postDimensions() const {
190 return postDimensions_;
192 void accept(AstVisitor *visitor) {
193 visitor->visit(this);
197 class Parameter : public PoolObject
200 ScopedRoot<String> tag_;
204 Parameter(Variable *var, Handle<String> tag, bool reference)
207 reference_(reference)
211 String *tag() const {
214 Variable *variable() const {
217 bool reference() const {
222 class NameProxy : public Expression
224 ScopedRoot<String> name_;
228 NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
238 String *name() const {
241 void accept(AstVisitor *visitor) {
242 visitor->visit(this);
244 BoundName *binding() const {
247 void bind(BoundName *name) {
253 class IntegerLiteral : public Expression
258 IntegerLiteral(const SourcePosition &pos, int value)
265 return kIntegerLiteral;
270 void accept(AstVisitor *visitor) {
271 visitor->visit(this);
275 class FloatLiteral : public Expression
280 FloatLiteral(const SourcePosition &pos, double value)
287 return kFloatLiteral;
289 double value() const {
292 void accept(AstVisitor *visitor) {
293 visitor->visit(this);
297 class StringLiteral : public Expression
299 ScopedRoot<ByteArray> string_;
302 StringLiteral(const SourcePosition &pos, ByteArray *array)
309 return kStringLiteral;
311 ByteArray *string() const {
314 void accept(AstVisitor *visitor) {
315 visitor->visit(this);
319 class BinaryExpression : public Expression
326 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
335 return kBinaryExpression;
337 Expression *left() const {
340 Expression *right() const {
343 TokenKind token() const {
346 void accept(AstVisitor *visitor) {
347 visitor->visit(this);
351 class IndexExpression : public Expression
357 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
365 return kIndexExpression;
367 Expression *left() const {
370 Expression *right() const {
373 void accept(AstVisitor *visitor) {
374 visitor->visit(this);
378 class CallExpression : public Expression
381 ExpressionList *arguments_;
384 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
387 arguments_(arguments)
392 return kCallExpression;
394 Expression *callee() const {
397 ExpressionList *arguments() const {
400 void accept(AstVisitor *visitor) {
401 visitor->visit(this);
405 class ForStatement : public Statement
408 Statement *initialization_;
409 Expression *condition_;
414 ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
415 Expression *condition, Statement *update, Statement *body)
418 initialization_(initialization),
419 condition_(condition),
426 return kForStatement;
428 Statement *initialization() const {
429 return initialization_;
431 Scope *scope() const {
434 Expression *condition() const {
437 Statement *update() const {
440 Statement *body() const {
443 void accept(AstVisitor *visitor) {
444 visitor->visit(this);
448 class WhileStatement : public Statement
451 Expression *condition_;
455 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
458 condition_(condition),
464 return kWhileStatement;
466 TokenKind token() const {
469 Expression *condition() const {
472 Statement *body() const {
475 void accept(AstVisitor *visitor) {
476 visitor->visit(this);
480 class ReturnStatement : public Statement
482 Expression *expression_;
485 ReturnStatement(const SourcePosition &pos, Expression *expression)
487 expression_(expression)
492 return kReturnStatement;
494 Expression *expression() const {
497 void accept(AstVisitor *visitor) {
498 visitor->visit(this);
502 class BreakStatement : public Statement
505 BreakStatement(const SourcePosition &pos)
511 return kBreakStatement;
513 void accept(AstVisitor *visitor) {
514 visitor->visit(this);
518 class ContinueStatement : public Statement
521 ContinueStatement(const SourcePosition &pos)
527 return kContinueStatement;
529 void accept(AstVisitor *visitor) {
530 visitor->visit(this);
534 class Assignment : public Expression
538 Expression *expression_;
541 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
552 TokenKind token() const {
555 Expression *lvalue() const {
558 Expression *expression() const {
561 void accept(AstVisitor *visitor) {
562 visitor->visit(this);
566 class ExpressionStatement : public Statement
568 Expression *expression_;
571 ExpressionStatement(Expression *expression)
572 : Statement(expression->pos()),
573 expression_(expression)
578 return kExpressionStatement;
580 Expression *expression() const {
583 void accept(AstVisitor *visitor) {
584 visitor->visit(this);
588 class BlockStatement : public Statement
591 StatementList *statements_;
594 BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
597 statements_(statements)
602 return kBlockStatement;
604 Scope *scope() const {
607 StatementList *statements() const {
610 void accept(AstVisitor *visitor) {
611 visitor->visit(this);
615 typedef std::vector<Parameter *> ParameterList;
617 class FunctionStatement : public Statement
622 ParameterList *parameters_;
625 FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
626 ParameterList *parameters)
631 parameters_(parameters)
636 return kFunctionStatement;
638 Scope *scope() const {
641 NamedFunction *fun() const {
644 Statement *body() const {
647 ParameterList *parameters() const {
650 void accept(AstVisitor *visitor) {
651 visitor->visit(this);
655 class IfStatement : public Statement
657 Expression *condition_;
662 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
664 condition_(condition),
673 Expression *condition() const {
676 Statement *ifTrue() const {
679 Statement *ifFalse() const {
682 void setIfFalse(Statement *ifFalse) {
685 void accept(AstVisitor *visitor) {
686 visitor->visit(this);
690 class EnumStatement : public Statement
692 ScopedRoot<String> name_;
699 Entry(NamedConstant *name, Expression *expr)
706 typedef std::vector<Entry> EntryList;
709 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
717 return kEnumStatement;
719 String *name() const {
722 EntryList *entries() const {
725 void accept(AstVisitor *visitor) {
726 visitor->visit(this);
733 class IncDecExpression : public Expression
736 Expression *expression_;
740 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
743 expression_(expression),
749 return kIncDecExpression;
751 TokenKind token() const {
754 Expression *expression() const {
757 bool postfix() const {
760 void accept(AstVisitor *visitor) {
761 visitor->visit(this);
767 typedef std::vector<NameProxy *> NameProxyList;
769 class ParseTree : public PoolObject
771 StatementList *statements_;
773 NameProxyList *unbound_;
776 ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
777 : statements_(statements),
785 StatementList *statements() const {
788 Scope *scope() const {
791 NameProxyList *unbound() const {
798 #endif // _include_jitcraft_ast_h_