Implemented break and continue support.
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 "StringPool.h"
24 #include "NameBinding.h"
29 _(VariableDeclaration) \
38 _(ExpressionStatement) \
39 _(FunctionStatement) \
48 // Forward declarations.
49 #define _(name) class name;
55 // Interface for AST nodes.
56 class AstNode : public PoolObject
60 # define _(name) k##name,
66 virtual Kind kind() const = 0;
68 #define _(name) bool is##name() { return kind() == k##name; } \
69 name *to##name() { assert(is##name()); return (name *)this; }
73 virtual void accept(AstVisitor *visitor) = 0;
79 #define _(name) virtual void visit(name *node) = 0;
91 static NameLocation Local(VariableDeclaration *decl) {
102 VariableDeclaration *local() const {
103 assert(kind() == LOCAL);
110 VariableDeclaration *decl;
114 class Statement : public AstNode
118 class Expression : public AstNode
128 void setType(Type *type) {
136 class Declaration : public Statement
140 typedef PoolList<Statement *> StatementList;
141 typedef std::vector<Expression *> ExpressionList;
143 class VariableDeclaration : public Declaration
146 Expression *initialization_;
147 ExpressionList *postDimensions_;
151 VariableDeclaration(Variable *var, Name *tag, ExpressionList *postDimensions, Expression *initialization)
153 postDimensions_(postDimensions),
154 initialization_(initialization),
163 return kVariableDeclaration;
165 Variable *variable() const {
168 Expression *initialization() const {
169 return initialization_;
171 ExpressionList *postDimensions() const {
172 return postDimensions_;
174 void accept(AstVisitor *visitor) {
175 visitor->visit(this);
179 class NameProxy : public Expression
185 NameProxy(Name *name, BoundName *binding)
197 void accept(AstVisitor *visitor) {
198 visitor->visit(this);
200 BoundName *binding() const {
203 void bind(BoundName *name) {
209 class IntegerLiteral : public Expression
214 IntegerLiteral(int value)
220 return kIntegerLiteral;
225 void accept(AstVisitor *visitor) {
226 visitor->visit(this);
230 class FloatLiteral : public Expression
235 FloatLiteral(double value)
241 return kFloatLiteral;
243 double value() const {
246 void accept(AstVisitor *visitor) {
247 visitor->visit(this);
251 class BinaryExpression : public Expression
258 BinaryExpression(TokenKind token, Expression *left, Expression *right)
266 return kBinaryExpression;
268 Expression *left() const {
271 Expression *right() const {
274 TokenKind token() const {
277 void accept(AstVisitor *visitor) {
278 visitor->visit(this);
282 class IndexExpression : public Expression
288 IndexExpression(Expression *left, Expression *right)
295 return kIndexExpression;
297 Expression *left() const {
300 Expression *right() const {
303 void accept(AstVisitor *visitor) {
304 visitor->visit(this);
308 class CallExpression : public Expression
311 ExpressionList *arguments_;
314 CallExpression(Expression *callee, ExpressionList *arguments)
316 arguments_(arguments)
321 return kCallExpression;
323 Expression *callee() const {
326 ExpressionList *arguments() const {
329 void accept(AstVisitor *visitor) {
330 visitor->visit(this);
334 class ForStatement : public Statement
337 VariableDeclaration *declaration_;
338 Expression *condition_;
343 ForStatement(Scope *scope, VariableDeclaration *declaration,
344 Expression *condition, Statement *update, Statement *body)
346 declaration_(declaration),
347 condition_(condition),
354 return kForStatement;
356 VariableDeclaration *declaration() const {
359 Scope *scope() const {
362 Expression *condition() const {
365 Statement *update() const {
368 Statement *body() const {
371 void accept(AstVisitor *visitor) {
372 visitor->visit(this);
376 class WhileStatement : public Statement
379 Expression *condition_;
383 WhileStatement(TokenKind kind, Expression *condition, Statement *body)
385 condition_(condition),
391 return kWhileStatement;
393 TokenKind token() const {
396 Expression *condition() const {
399 Statement *body() const {
402 void accept(AstVisitor *visitor) {
403 visitor->visit(this);
407 class ReturnStatement : public Statement
409 Expression *expression_;
412 ReturnStatement(Expression *expression)
413 : expression_(expression)
418 return kReturnStatement;
420 Expression *expression() const {
423 void accept(AstVisitor *visitor) {
424 visitor->visit(this);
428 class BreakStatement : public Statement
436 return kBreakStatement;
438 void accept(AstVisitor *visitor) {
439 visitor->visit(this);
443 class ContinueStatement : public Statement
451 return kContinueStatement;
453 void accept(AstVisitor *visitor) {
454 visitor->visit(this);
458 class Assignment : public Expression
461 Expression *expression_;
464 Assignment(Expression *left, Expression *right)
473 Expression *lvalue() const {
476 Expression *expression() const {
479 void accept(AstVisitor *visitor) {
480 visitor->visit(this);
484 class ExpressionStatement : public Statement
486 Expression *expression_;
489 ExpressionStatement(Expression *expression)
490 : expression_(expression)
495 return kExpressionStatement;
497 Expression *expression() const {
500 void accept(AstVisitor *visitor) {
501 visitor->visit(this);
505 class BlockStatement : public Statement
508 StatementList *statements_;
511 BlockStatement(Scope *scope, StatementList *statements)
513 statements_(statements)
518 return kBlockStatement;
520 Scope *scope() const {
523 StatementList *statements() const {
526 void accept(AstVisitor *visitor) {
527 visitor->visit(this);
531 class FunctionStatement : public Statement
538 FunctionStatement(Scope *scope, NamedFunction *fun, Statement *body)
546 return kFunctionStatement;
548 Scope *scope() const {
551 NamedFunction *fun() const {
554 Statement *body() const {
557 void accept(AstVisitor *visitor) {
558 visitor->visit(this);
562 class IfStatement : public Statement
564 Expression *condition_;
569 IfStatement(Expression *condition, Statement *ifTrue)
570 : condition_(condition),
579 Expression *condition() const {
582 Statement *ifTrue() const {
585 Statement *ifFalse() const {
588 void setIfFalse(Statement *ifFalse) {
591 void accept(AstVisitor *visitor) {
592 visitor->visit(this);
596 class EnumStatement : public Statement
605 Entry(NamedConstant *name, Expression *expr)
612 typedef std::vector<Entry> EntryList;
615 EnumStatement(Name *name, EntryList *entries)
622 return kEnumStatement;
627 EntryList *entries() const {
630 void accept(AstVisitor *visitor) {
631 visitor->visit(this);
640 typedef std::vector<NameProxy *> NameProxyList;
642 class ParseTree : public PoolObject
644 StatementList *statements_;
646 NameProxyList *unbound_;
649 ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
650 : statements_(statements),
658 StatementList *statements() const {
661 Scope *scope() const {
664 NameProxyList *unbound() const {
671 #endif // _include_jitcraft_ast_h_