Convert Name and StringPool to a GC-safe symbol table.
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 std::vector<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_;
203 Parameter(Variable *var, Handle<String> tag, bool reference)
206 reference_(reference)
210 String *tag() const {
213 Variable *variable() const {
216 bool reference() const {
221 class NameProxy : public Expression
223 ScopedRoot<String> name_;
227 NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
237 String *name() const {
240 void accept(AstVisitor *visitor) {
241 visitor->visit(this);
243 BoundName *binding() const {
246 void bind(BoundName *name) {
252 class IntegerLiteral : public Expression
257 IntegerLiteral(const SourcePosition &pos, int value)
264 return kIntegerLiteral;
269 void accept(AstVisitor *visitor) {
270 visitor->visit(this);
274 class FloatLiteral : public Expression
279 FloatLiteral(const SourcePosition &pos, double value)
286 return kFloatLiteral;
288 double value() const {
291 void accept(AstVisitor *visitor) {
292 visitor->visit(this);
296 class StringLiteral : public Expression
298 ScopedRoot<ByteArray> string_;
301 StringLiteral(const SourcePosition &pos, ByteArray *array)
308 return kStringLiteral;
310 ByteArray *string() const {
313 void accept(AstVisitor *visitor) {
314 visitor->visit(this);
318 class BinaryExpression : public Expression
325 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
334 return kBinaryExpression;
336 Expression *left() const {
339 Expression *right() const {
342 TokenKind token() const {
345 void accept(AstVisitor *visitor) {
346 visitor->visit(this);
350 class IndexExpression : public Expression
356 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
364 return kIndexExpression;
366 Expression *left() const {
369 Expression *right() const {
372 void accept(AstVisitor *visitor) {
373 visitor->visit(this);
377 class CallExpression : public Expression
380 ExpressionList *arguments_;
383 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
386 arguments_(arguments)
391 return kCallExpression;
393 Expression *callee() const {
396 ExpressionList *arguments() const {
399 void accept(AstVisitor *visitor) {
400 visitor->visit(this);
404 class ForStatement : public Statement
407 Statement *initialization_;
408 Expression *condition_;
413 ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
414 Expression *condition, Statement *update, Statement *body)
417 initialization_(initialization),
418 condition_(condition),
425 return kForStatement;
427 Statement *initialization() const {
428 return initialization_;
430 Scope *scope() const {
433 Expression *condition() const {
436 Statement *update() const {
439 Statement *body() const {
442 void accept(AstVisitor *visitor) {
443 visitor->visit(this);
447 class WhileStatement : public Statement
450 Expression *condition_;
454 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
457 condition_(condition),
463 return kWhileStatement;
465 TokenKind token() const {
468 Expression *condition() const {
471 Statement *body() const {
474 void accept(AstVisitor *visitor) {
475 visitor->visit(this);
479 class ReturnStatement : public Statement
481 Expression *expression_;
484 ReturnStatement(const SourcePosition &pos, Expression *expression)
486 expression_(expression)
491 return kReturnStatement;
493 Expression *expression() const {
496 void accept(AstVisitor *visitor) {
497 visitor->visit(this);
501 class BreakStatement : public Statement
504 BreakStatement(const SourcePosition &pos)
510 return kBreakStatement;
512 void accept(AstVisitor *visitor) {
513 visitor->visit(this);
517 class ContinueStatement : public Statement
520 ContinueStatement(const SourcePosition &pos)
526 return kContinueStatement;
528 void accept(AstVisitor *visitor) {
529 visitor->visit(this);
533 class Assignment : public Expression
537 Expression *expression_;
540 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
551 TokenKind token() const {
554 Expression *lvalue() const {
557 Expression *expression() const {
560 void accept(AstVisitor *visitor) {
561 visitor->visit(this);
565 class ExpressionStatement : public Statement
567 Expression *expression_;
570 ExpressionStatement(Expression *expression)
571 : Statement(expression->pos()),
572 expression_(expression)
577 return kExpressionStatement;
579 Expression *expression() const {
582 void accept(AstVisitor *visitor) {
583 visitor->visit(this);
587 class BlockStatement : public Statement
590 StatementList *statements_;
593 BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
596 statements_(statements)
601 return kBlockStatement;
603 Scope *scope() const {
606 StatementList *statements() const {
609 void accept(AstVisitor *visitor) {
610 visitor->visit(this);
614 typedef std::vector<Parameter *> ParameterList;
616 class FunctionStatement : public Statement
621 ParameterList *parameters_;
624 FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
625 ParameterList *parameters)
630 parameters_(parameters)
635 return kFunctionStatement;
637 Scope *scope() const {
640 NamedFunction *fun() const {
643 Statement *body() const {
646 ParameterList *parameters() const {
649 void accept(AstVisitor *visitor) {
650 visitor->visit(this);
654 class IfStatement : public Statement
656 Expression *condition_;
661 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
663 condition_(condition),
672 Expression *condition() const {
675 Statement *ifTrue() const {
678 Statement *ifFalse() const {
681 void setIfFalse(Statement *ifFalse) {
684 void accept(AstVisitor *visitor) {
685 visitor->visit(this);
689 class EnumStatement : public Statement
691 ScopedRoot<String> name_;
698 Entry(NamedConstant *name, Expression *expr)
705 typedef std::vector<Entry> EntryList;
708 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
716 return kEnumStatement;
718 String *name() const {
721 EntryList *entries() const {
724 void accept(AstVisitor *visitor) {
725 visitor->visit(this);
732 class IncDecExpression : public Expression
735 Expression *expression_;
739 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
742 expression_(expression),
748 return kIncDecExpression;
750 TokenKind token() const {
753 Expression *expression() const {
756 bool postfix() const {
759 void accept(AstVisitor *visitor) {
760 visitor->visit(this);
766 typedef std::vector<NameProxy *> NameProxyList;
768 class ParseTree : public PoolObject
770 StatementList *statements_;
772 NameProxyList *unbound_;
775 ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
776 : statements_(statements),
784 StatementList *statements() const {
787 Scope *scope() const {
790 NameProxyList *unbound() const {
797 #endif // _include_jitcraft_ast_h_