Implemented ! operator.
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) \
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 PoolList<Expression *> 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_;
203 ExpressionList *dimensions_;
206 Parameter(Variable *var, Handle<String> tag, bool reference, bool isConst, ExpressionList *dimensions)
209 reference_(reference),
211 dimensions_(dimensions)
215 String *tag() const {
218 Variable *variable() const {
221 bool reference() const {
224 ExpressionList *dimensions() const {
227 bool isConst() const {
232 class NameProxy : public Expression
234 ScopedRoot<String> name_;
238 NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
248 String *name() const {
251 void accept(AstVisitor *visitor) {
252 visitor->visit(this);
254 BoundName *binding() const {
257 void bind(BoundName *name) {
263 class IntegerLiteral : public Expression
268 IntegerLiteral(const SourcePosition &pos, int value)
275 return kIntegerLiteral;
280 void accept(AstVisitor *visitor) {
281 visitor->visit(this);
285 class FloatLiteral : public Expression
290 FloatLiteral(const SourcePosition &pos, double value)
297 return kFloatLiteral;
299 double value() const {
302 void accept(AstVisitor *visitor) {
303 visitor->visit(this);
307 class StringLiteral : public Expression
309 ScopedRoot<ByteArray> string_;
312 StringLiteral(const SourcePosition &pos, ByteArray *array)
319 return kStringLiteral;
321 ByteArray *string() const {
324 void accept(AstVisitor *visitor) {
325 visitor->visit(this);
329 class UnaryExpression : public Expression
331 Expression *expression_;
335 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
343 return kUnaryExpression;
345 Expression *expression() const {
348 TokenKind token() const {
351 void accept(AstVisitor *visitor) {
352 visitor->visit(this);
356 class BinaryExpression : public Expression
363 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
372 return kBinaryExpression;
374 Expression *left() const {
377 Expression *right() const {
380 TokenKind token() const {
383 void accept(AstVisitor *visitor) {
384 visitor->visit(this);
388 class IndexExpression : public Expression
394 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
402 return kIndexExpression;
404 Expression *left() const {
407 Expression *right() const {
410 void accept(AstVisitor *visitor) {
411 visitor->visit(this);
415 class CallExpression : public Expression
418 ExpressionList *arguments_;
421 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
424 arguments_(arguments)
429 return kCallExpression;
431 Expression *callee() const {
434 ExpressionList *arguments() const {
437 void accept(AstVisitor *visitor) {
438 visitor->visit(this);
442 class ForStatement : public Statement
445 Statement *initialization_;
446 Expression *condition_;
451 ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
452 Expression *condition, Statement *update, Statement *body)
455 initialization_(initialization),
456 condition_(condition),
463 return kForStatement;
465 Statement *initialization() const {
466 return initialization_;
468 Scope *scope() const {
471 Expression *condition() const {
474 Statement *update() const {
477 Statement *body() const {
480 void accept(AstVisitor *visitor) {
481 visitor->visit(this);
485 class WhileStatement : public Statement
488 Expression *condition_;
492 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
495 condition_(condition),
501 return kWhileStatement;
503 TokenKind token() const {
506 Expression *condition() const {
509 Statement *body() const {
512 void accept(AstVisitor *visitor) {
513 visitor->visit(this);
517 class ReturnStatement : public Statement
519 Expression *expression_;
522 ReturnStatement(const SourcePosition &pos, Expression *expression)
524 expression_(expression)
529 return kReturnStatement;
531 Expression *expression() const {
534 void accept(AstVisitor *visitor) {
535 visitor->visit(this);
539 class BreakStatement : public Statement
542 BreakStatement(const SourcePosition &pos)
548 return kBreakStatement;
550 void accept(AstVisitor *visitor) {
551 visitor->visit(this);
555 class ContinueStatement : public Statement
558 ContinueStatement(const SourcePosition &pos)
564 return kContinueStatement;
566 void accept(AstVisitor *visitor) {
567 visitor->visit(this);
571 class Assignment : public Expression
575 Expression *expression_;
578 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
589 TokenKind token() const {
592 Expression *lvalue() const {
595 Expression *expression() const {
598 void accept(AstVisitor *visitor) {
599 visitor->visit(this);
603 class ExpressionStatement : public Statement
605 Expression *expression_;
608 ExpressionStatement(Expression *expression)
609 : Statement(expression->pos()),
610 expression_(expression)
615 return kExpressionStatement;
617 Expression *expression() const {
620 void accept(AstVisitor *visitor) {
621 visitor->visit(this);
625 class BlockStatement : public Statement
628 StatementList *statements_;
631 BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
634 statements_(statements)
639 return kBlockStatement;
641 Scope *scope() const {
644 StatementList *statements() const {
647 void accept(AstVisitor *visitor) {
648 visitor->visit(this);
652 typedef PoolList<Parameter *> ParameterList;
654 class FunctionStatement : public Statement
659 ParameterList *parameters_;
660 bool explicitReturn_;
663 FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
664 ParameterList *parameters, bool explicitReturn)
669 parameters_(parameters),
670 explicitReturn_(explicitReturn)
675 return kFunctionStatement;
677 Scope *scope() const {
680 NamedFunction *fun() const {
683 Statement *body() const {
686 ParameterList *parameters() const {
689 void accept(AstVisitor *visitor) {
690 visitor->visit(this);
692 bool hasExplicitReturn() const {
693 return explicitReturn_;
697 class IfStatement : public Statement
699 Expression *condition_;
704 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
706 condition_(condition),
715 Expression *condition() const {
718 Statement *ifTrue() const {
721 Statement *ifFalse() const {
724 void setIfFalse(Statement *ifFalse) {
727 void accept(AstVisitor *visitor) {
728 visitor->visit(this);
732 class EnumStatement : public Statement
734 ScopedRoot<String> name_;
741 Entry(NamedConstant *name, Expression *expr)
748 typedef PoolList<Entry> EntryList;
751 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
759 return kEnumStatement;
761 String *name() const {
764 EntryList *entries() const {
767 void accept(AstVisitor *visitor) {
768 visitor->visit(this);
775 class IncDecExpression : public Expression
778 Expression *expression_;
782 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
785 expression_(expression),
791 return kIncDecExpression;
793 TokenKind token() const {
796 Expression *expression() const {
799 bool postfix() const {
802 void accept(AstVisitor *visitor) {
803 visitor->visit(this);
809 typedef PoolList<NameProxy *> NameProxyList;
811 class ParseTree : public PoolObject
813 StatementList *statements_;
815 NameProxyList *unbound_;
818 ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
819 : statements_(statements),
827 StatementList *statements() const {
830 Scope *scope() const {
833 NameProxyList *unbound() const {
840 #endif // _include_jitcraft_ast_h_