Add GCC/Linux 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 "NameBinding.h"
29 _(VariableDeclaration) \
39 _(ExpressionStatement) \
40 _(FunctionStatement) \
47 _(ContinueStatement) \
52 // Forward declarations.
53 #define _(name) class name;
59 // Interface for AST nodes.
60 class AstNode : public PoolObject
66 # define _(name) k##name,
72 AstNode(const SourcePosition &pos)
77 virtual Kind kind() const = 0;
79 #define _(name) bool is##name() { return kind() == k##name; } \
80 name *to##name() { assert(is##name()); return (name *)this; }
84 virtual void accept(AstVisitor *visitor) = 0;
86 const SourcePosition &pos() const {
94 #define _(name) virtual void visit(name *node) = 0;
106 static NameLocation Local(VariableDeclaration *decl) {
117 VariableDeclaration *local() const {
118 assert(kind() == LOCAL);
125 VariableDeclaration *decl;
129 class Statement : public AstNode
132 Statement(const SourcePosition &pos)
138 class Expression : public AstNode
140 ScopedRoot<Type> type_;
143 Expression(const SourcePosition &pos)
149 void setType(Type *type) {
157 typedef PoolList<Statement *> StatementList;
158 typedef PoolList<Expression *> ExpressionList;
160 class VariableDeclaration : public Statement
163 Expression *initialization_;
164 ExpressionList *postDimensions_;
165 ScopedRoot<String> tag_;
168 VariableDeclaration(const SourcePosition &pos, Variable *var, Handle<String> tag,
169 ExpressionList *postDimensions, Expression *initialization)
172 initialization_(initialization),
173 postDimensions_(postDimensions),
178 String *tag() const {
182 return kVariableDeclaration;
184 Variable *variable() const {
187 Expression *initialization() const {
188 return initialization_;
190 ExpressionList *postDimensions() const {
191 return postDimensions_;
193 void accept(AstVisitor *visitor) {
194 visitor->visit(this);
198 class Parameter : public PoolObject
201 ScopedRoot<String> tag_;
204 ExpressionList *dimensions_;
207 Parameter(Variable *var, Handle<String> tag, bool reference, bool isConst, ExpressionList *dimensions)
210 reference_(reference),
212 dimensions_(dimensions)
216 String *tag() const {
219 Variable *variable() const {
222 bool reference() const {
225 ExpressionList *dimensions() const {
228 bool isConst() const {
233 class NameProxy : public Expression
235 ScopedRoot<String> name_;
239 NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
249 String *name() const {
252 void accept(AstVisitor *visitor) {
253 visitor->visit(this);
255 BoundName *binding() const {
258 void bind(BoundName *name) {
264 class IntegerLiteral : public Expression
269 IntegerLiteral(const SourcePosition &pos, int value)
276 return kIntegerLiteral;
281 void accept(AstVisitor *visitor) {
282 visitor->visit(this);
286 class FloatLiteral : public Expression
291 FloatLiteral(const SourcePosition &pos, double value)
298 return kFloatLiteral;
300 double value() const {
303 void accept(AstVisitor *visitor) {
304 visitor->visit(this);
308 class StringLiteral : public Expression
310 ScopedRoot<ByteArray> string_;
313 StringLiteral(const SourcePosition &pos, ByteArray *array)
320 return kStringLiteral;
322 ByteArray *string() const {
325 void accept(AstVisitor *visitor) {
326 visitor->visit(this);
330 class UnaryExpression : public Expression
332 Expression *expression_;
336 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
344 return kUnaryExpression;
346 Expression *expression() const {
349 TokenKind token() const {
352 void accept(AstVisitor *visitor) {
353 visitor->visit(this);
357 class BinaryExpression : public Expression
364 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
373 return kBinaryExpression;
375 Expression *left() const {
378 Expression *right() const {
381 TokenKind token() const {
384 void accept(AstVisitor *visitor) {
385 visitor->visit(this);
389 class TernaryExpression : public Expression
391 Expression *condition_;
396 TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
398 condition_(condition),
405 return kTernaryExpression;
407 Expression *condition() const {
410 Expression *left() const {
413 Expression *right() const {
416 void accept(AstVisitor *visitor) {
417 visitor->visit(this);
421 class IndexExpression : public Expression
427 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
435 return kIndexExpression;
437 Expression *left() const {
440 Expression *right() const {
443 void accept(AstVisitor *visitor) {
444 visitor->visit(this);
448 class CallExpression : public Expression
451 ExpressionList *arguments_;
454 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
457 arguments_(arguments)
462 return kCallExpression;
464 Expression *callee() const {
467 ExpressionList *arguments() const {
470 void accept(AstVisitor *visitor) {
471 visitor->visit(this);
475 class ForStatement : public Statement
478 Statement *initialization_;
479 Expression *condition_;
484 ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
485 Expression *condition, Statement *update, Statement *body)
488 initialization_(initialization),
489 condition_(condition),
496 return kForStatement;
498 Statement *initialization() const {
499 return initialization_;
501 Scope *scope() const {
504 Expression *condition() const {
507 Statement *update() const {
510 Statement *body() const {
513 void accept(AstVisitor *visitor) {
514 visitor->visit(this);
518 class WhileStatement : public Statement
521 Expression *condition_;
525 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
528 condition_(condition),
534 return kWhileStatement;
536 TokenKind token() const {
539 Expression *condition() const {
542 Statement *body() const {
545 void accept(AstVisitor *visitor) {
546 visitor->visit(this);
550 class ReturnStatement : public Statement
552 Expression *expression_;
555 ReturnStatement(const SourcePosition &pos, Expression *expression)
557 expression_(expression)
562 return kReturnStatement;
564 Expression *expression() const {
567 void accept(AstVisitor *visitor) {
568 visitor->visit(this);
572 class BreakStatement : public Statement
575 BreakStatement(const SourcePosition &pos)
581 return kBreakStatement;
583 void accept(AstVisitor *visitor) {
584 visitor->visit(this);
588 class ContinueStatement : public Statement
591 ContinueStatement(const SourcePosition &pos)
597 return kContinueStatement;
599 void accept(AstVisitor *visitor) {
600 visitor->visit(this);
604 class Assignment : public Expression
608 Expression *expression_;
611 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
622 TokenKind token() const {
625 Expression *lvalue() const {
628 Expression *expression() const {
631 void accept(AstVisitor *visitor) {
632 visitor->visit(this);
636 class ExpressionStatement : public Statement
638 Expression *expression_;
641 ExpressionStatement(Expression *expression)
642 : Statement(expression->pos()),
643 expression_(expression)
648 return kExpressionStatement;
650 Expression *expression() const {
653 void accept(AstVisitor *visitor) {
654 visitor->visit(this);
658 class BlockStatement : public Statement
661 StatementList *statements_;
664 BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
667 statements_(statements)
672 return kBlockStatement;
674 Scope *scope() const {
677 StatementList *statements() const {
680 void accept(AstVisitor *visitor) {
681 visitor->visit(this);
685 typedef PoolList<Parameter *> ParameterList;
687 class FunctionStatement : public Statement
692 ParameterList *parameters_;
693 bool explicitReturn_;
696 FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
697 ParameterList *parameters, bool explicitReturn)
702 parameters_(parameters),
703 explicitReturn_(explicitReturn)
708 return kFunctionStatement;
710 Scope *scope() const {
713 NamedFunction *fun() const {
716 Statement *body() const {
719 ParameterList *parameters() const {
722 void accept(AstVisitor *visitor) {
723 visitor->visit(this);
725 bool hasExplicitReturn() const {
726 return explicitReturn_;
730 class IfStatement : public Statement
732 Expression *condition_;
737 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
739 condition_(condition),
748 Expression *condition() const {
751 Statement *ifTrue() const {
754 Statement *ifFalse() const {
757 void setIfFalse(Statement *ifFalse) {
760 void accept(AstVisitor *visitor) {
761 visitor->visit(this);
765 class EnumStatement : public Statement
767 ScopedRoot<String> name_;
774 Entry(NamedConstant *name, Expression *expr)
781 typedef PoolList<Entry> EntryList;
784 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
792 return kEnumStatement;
794 String *name() const {
797 EntryList *entries() const {
800 void accept(AstVisitor *visitor) {
801 visitor->visit(this);
808 class IncDecExpression : public Expression
811 Expression *expression_;
815 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
818 expression_(expression),
824 return kIncDecExpression;
826 TokenKind token() const {
829 Expression *expression() const {
832 bool postfix() const {
835 void accept(AstVisitor *visitor) {
836 visitor->visit(this);
842 typedef PoolList<NameProxy *> NameProxyList;
844 class ParseTree : public PoolObject
846 StatementList *statements_;
848 NameProxyList *unbound_;
851 ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
852 : statements_(statements),
860 StatementList *statements() const {
863 Scope *scope() const {
866 NameProxyList *unbound() const {
873 #endif // _include_jitcraft_ast_h_