Added definite return analysis and void-return deduction.
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_;
202 ExpressionList *dimensions_;
205 Parameter(Variable *var, Handle<String> tag, bool reference, bool isConst, ExpressionList *dimensions)
208 reference_(reference),
210 dimensions_(dimensions)
214 String *tag() const {
217 Variable *variable() const {
220 bool reference() const {
223 ExpressionList *dimensions() const {
226 bool isConst() const {
231 class NameProxy : public Expression
233 ScopedRoot<String> name_;
237 NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
247 String *name() const {
250 void accept(AstVisitor *visitor) {
251 visitor->visit(this);
253 BoundName *binding() const {
256 void bind(BoundName *name) {
262 class IntegerLiteral : public Expression
267 IntegerLiteral(const SourcePosition &pos, int value)
274 return kIntegerLiteral;
279 void accept(AstVisitor *visitor) {
280 visitor->visit(this);
284 class FloatLiteral : public Expression
289 FloatLiteral(const SourcePosition &pos, double value)
296 return kFloatLiteral;
298 double value() const {
301 void accept(AstVisitor *visitor) {
302 visitor->visit(this);
306 class StringLiteral : public Expression
308 ScopedRoot<ByteArray> string_;
311 StringLiteral(const SourcePosition &pos, ByteArray *array)
318 return kStringLiteral;
320 ByteArray *string() const {
323 void accept(AstVisitor *visitor) {
324 visitor->visit(this);
328 class BinaryExpression : public Expression
335 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
344 return kBinaryExpression;
346 Expression *left() const {
349 Expression *right() const {
352 TokenKind token() const {
355 void accept(AstVisitor *visitor) {
356 visitor->visit(this);
360 class IndexExpression : public Expression
366 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
374 return kIndexExpression;
376 Expression *left() const {
379 Expression *right() const {
382 void accept(AstVisitor *visitor) {
383 visitor->visit(this);
387 class CallExpression : public Expression
390 ExpressionList *arguments_;
393 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
396 arguments_(arguments)
401 return kCallExpression;
403 Expression *callee() const {
406 ExpressionList *arguments() const {
409 void accept(AstVisitor *visitor) {
410 visitor->visit(this);
414 class ForStatement : public Statement
417 Statement *initialization_;
418 Expression *condition_;
423 ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
424 Expression *condition, Statement *update, Statement *body)
427 initialization_(initialization),
428 condition_(condition),
435 return kForStatement;
437 Statement *initialization() const {
438 return initialization_;
440 Scope *scope() const {
443 Expression *condition() const {
446 Statement *update() const {
449 Statement *body() const {
452 void accept(AstVisitor *visitor) {
453 visitor->visit(this);
457 class WhileStatement : public Statement
460 Expression *condition_;
464 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
467 condition_(condition),
473 return kWhileStatement;
475 TokenKind token() const {
478 Expression *condition() const {
481 Statement *body() const {
484 void accept(AstVisitor *visitor) {
485 visitor->visit(this);
489 class ReturnStatement : public Statement
491 Expression *expression_;
494 ReturnStatement(const SourcePosition &pos, Expression *expression)
496 expression_(expression)
501 return kReturnStatement;
503 Expression *expression() const {
506 void accept(AstVisitor *visitor) {
507 visitor->visit(this);
511 class BreakStatement : public Statement
514 BreakStatement(const SourcePosition &pos)
520 return kBreakStatement;
522 void accept(AstVisitor *visitor) {
523 visitor->visit(this);
527 class ContinueStatement : public Statement
530 ContinueStatement(const SourcePosition &pos)
536 return kContinueStatement;
538 void accept(AstVisitor *visitor) {
539 visitor->visit(this);
543 class Assignment : public Expression
547 Expression *expression_;
550 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
561 TokenKind token() const {
564 Expression *lvalue() const {
567 Expression *expression() const {
570 void accept(AstVisitor *visitor) {
571 visitor->visit(this);
575 class ExpressionStatement : public Statement
577 Expression *expression_;
580 ExpressionStatement(Expression *expression)
581 : Statement(expression->pos()),
582 expression_(expression)
587 return kExpressionStatement;
589 Expression *expression() const {
592 void accept(AstVisitor *visitor) {
593 visitor->visit(this);
597 class BlockStatement : public Statement
600 StatementList *statements_;
603 BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
606 statements_(statements)
611 return kBlockStatement;
613 Scope *scope() const {
616 StatementList *statements() const {
619 void accept(AstVisitor *visitor) {
620 visitor->visit(this);
624 typedef PoolList<Parameter *> ParameterList;
626 class FunctionStatement : public Statement
631 ParameterList *parameters_;
632 bool explicitReturn_;
635 FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
636 ParameterList *parameters, bool explicitReturn)
641 parameters_(parameters),
642 explicitReturn_(explicitReturn)
647 return kFunctionStatement;
649 Scope *scope() const {
652 NamedFunction *fun() const {
655 Statement *body() const {
658 ParameterList *parameters() const {
661 void accept(AstVisitor *visitor) {
662 visitor->visit(this);
664 bool hasExplicitReturn() const {
665 return explicitReturn_;
669 class IfStatement : public Statement
671 Expression *condition_;
676 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
678 condition_(condition),
687 Expression *condition() const {
690 Statement *ifTrue() const {
693 Statement *ifFalse() const {
696 void setIfFalse(Statement *ifFalse) {
699 void accept(AstVisitor *visitor) {
700 visitor->visit(this);
704 class EnumStatement : public Statement
706 ScopedRoot<String> name_;
713 Entry(NamedConstant *name, Expression *expr)
720 typedef PoolList<Entry> EntryList;
723 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
731 return kEnumStatement;
733 String *name() const {
736 EntryList *entries() const {
739 void accept(AstVisitor *visitor) {
740 visitor->visit(this);
747 class IncDecExpression : public Expression
750 Expression *expression_;
754 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
757 expression_(expression),
763 return kIncDecExpression;
765 TokenKind token() const {
768 Expression *expression() const {
771 bool postfix() const {
774 void accept(AstVisitor *visitor) {
775 visitor->visit(this);
781 typedef PoolList<NameProxy *> NameProxyList;
783 class ParseTree : public PoolObject
785 StatementList *statements_;
787 NameProxyList *unbound_;
790 ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
791 : statements_(statements),
799 StatementList *statements() const {
802 Scope *scope() const {
805 NameProxyList *unbound() const {
812 #endif // _include_jitcraft_ast_h_