Support TOK_CONST as a declarator in the parser.
1 /* vim: set ts=4 sw=4 tw=99 et:
3 * Copyright (C) 2012 David Anderson
5 * This file is part of SourcePawn.
7 * SourcePawn is free software: you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License as published by the Free
9 * Software Foundation, either version 3 of the License, or (at your option)
12 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
13 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with
17 * SourcePawn. If not, see http://www.gnu.org/licenses/.
19 #ifndef _include_jitcraft_ast_h_
20 #define _include_jitcraft_ast_h_
22 #include "PoolAllocator.h"
24 #include "NameBinding.h"
30 _(VariableDeclaration) \
40 _(ExpressionStatement) \
41 _(FunctionStatement) \
48 _(ContinueStatement) \
53 // Forward declarations.
54 #define _(name) class name;
60 // Interface for AST nodes.
61 class AstNode : public PoolObject
67 # define _(name) k##name,
73 AstNode(const SourcePosition &pos)
78 virtual Kind kind() const = 0;
80 #define _(name) bool is##name() { return kind() == k##name; } \
81 name *to##name() { assert(is##name()); return (name *)this; }
85 virtual void accept(AstVisitor *visitor) = 0;
87 const SourcePosition &pos() const {
95 #define _(name) virtual void visit(name *node) = 0;
107 static NameLocation Local(VariableDeclaration *decl) {
118 VariableDeclaration *local() const {
119 assert(kind() == LOCAL);
126 VariableDeclaration *decl;
130 class Statement : public AstNode
133 Statement(const SourcePosition &pos)
139 class Expression : public AstNode
141 ScopedRoot<Type> type_;
144 Expression(const SourcePosition &pos)
150 void setType(Type *type) {
158 typedef PoolList<Statement *> StatementList;
159 typedef PoolList<Expression *> ExpressionList;
161 class VariableDeclaration : public Statement
164 Expression *initialization_;
165 ExpressionList *postDimensions_;
166 ScopedRoot<String> tag_;
167 TokenKind declarator_;
170 VariableDeclaration(const SourcePosition &pos, TokenKind declarator, Variable *var,
171 Handle<String> tag, ExpressionList *postDimensions,
172 Expression *initialization)
175 initialization_(initialization),
176 postDimensions_(postDimensions),
181 String *tag() const {
185 return kVariableDeclaration;
187 Variable *variable() const {
190 Expression *initialization() const {
191 return initialization_;
193 ExpressionList *postDimensions() const {
194 return postDimensions_;
196 void accept(AstVisitor *visitor) {
197 visitor->visit(this);
199 TokenKind declarator() const {
204 class Parameter : public PoolObject
207 ScopedRoot<String> tag_;
210 ExpressionList *dimensions_;
211 Expression *initializer_;
214 Parameter(Variable *var, Handle<String> tag, bool reference, bool isConst,
215 ExpressionList *dimensions, Expression *initializer)
218 reference_(reference),
220 dimensions_(dimensions),
221 initializer_(initializer)
225 String *tag() const {
228 Variable *variable() const {
231 bool reference() const {
234 ExpressionList *dimensions() const {
237 bool isConst() const {
240 Expression *initializer() const {
245 class NameProxy : public Expression
247 ScopedRoot<String> name_;
251 NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
261 String *name() const {
264 void accept(AstVisitor *visitor) {
265 visitor->visit(this);
267 BoundName *binding() const {
270 void bind(BoundName *name) {
276 class IntegerLiteral : public Expression
281 IntegerLiteral(const SourcePosition &pos, int value)
288 return kIntegerLiteral;
293 void accept(AstVisitor *visitor) {
294 visitor->visit(this);
298 class FloatLiteral : public Expression
303 FloatLiteral(const SourcePosition &pos, double value)
310 return kFloatLiteral;
312 double value() const {
315 void accept(AstVisitor *visitor) {
316 visitor->visit(this);
320 class StringLiteral : public Expression
322 ScopedRoot<ByteArray> string_;
325 StringLiteral(const SourcePosition &pos, ByteArray *array)
332 return kStringLiteral;
334 ByteArray *string() const {
337 void accept(AstVisitor *visitor) {
338 visitor->visit(this);
342 class UnaryExpression : public Expression
344 Expression *expression_;
348 UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
356 return kUnaryExpression;
358 Expression *expression() const {
361 TokenKind token() const {
364 void accept(AstVisitor *visitor) {
365 visitor->visit(this);
369 class BinaryExpression : public Expression
376 BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
385 return kBinaryExpression;
387 Expression *left() const {
390 Expression *right() const {
393 TokenKind token() const {
396 void accept(AstVisitor *visitor) {
397 visitor->visit(this);
401 class TernaryExpression : public Expression
403 Expression *condition_;
408 TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
410 condition_(condition),
417 return kTernaryExpression;
419 Expression *condition() const {
422 Expression *left() const {
425 Expression *right() const {
428 void accept(AstVisitor *visitor) {
429 visitor->visit(this);
433 class IndexExpression : public Expression
439 IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
447 return kIndexExpression;
449 Expression *left() const {
452 Expression *right() const {
455 void accept(AstVisitor *visitor) {
456 visitor->visit(this);
460 class CallExpression : public Expression
463 ExpressionList *arguments_;
466 CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
469 arguments_(arguments)
474 return kCallExpression;
476 Expression *callee() const {
479 ExpressionList *arguments() const {
482 void accept(AstVisitor *visitor) {
483 visitor->visit(this);
487 class ForStatement : public Statement
490 Statement *initialization_;
491 Expression *condition_;
496 ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
497 Expression *condition, Statement *update, Statement *body)
500 initialization_(initialization),
501 condition_(condition),
508 return kForStatement;
510 Statement *initialization() const {
511 return initialization_;
513 Scope *scope() const {
516 Expression *condition() const {
519 Statement *update() const {
522 Statement *body() const {
525 void accept(AstVisitor *visitor) {
526 visitor->visit(this);
530 class WhileStatement : public Statement
533 Expression *condition_;
537 WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
540 condition_(condition),
546 return kWhileStatement;
548 TokenKind token() const {
551 Expression *condition() const {
554 Statement *body() const {
557 void accept(AstVisitor *visitor) {
558 visitor->visit(this);
562 class ReturnStatement : public Statement
564 Expression *expression_;
567 ReturnStatement(const SourcePosition &pos, Expression *expression)
569 expression_(expression)
574 return kReturnStatement;
576 Expression *expression() const {
579 void accept(AstVisitor *visitor) {
580 visitor->visit(this);
584 class BreakStatement : public Statement
587 BreakStatement(const SourcePosition &pos)
593 return kBreakStatement;
595 void accept(AstVisitor *visitor) {
596 visitor->visit(this);
600 class ContinueStatement : public Statement
603 ContinueStatement(const SourcePosition &pos)
609 return kContinueStatement;
611 void accept(AstVisitor *visitor) {
612 visitor->visit(this);
616 class Assignment : public Expression
620 Expression *expression_;
623 Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
634 TokenKind token() const {
637 Expression *lvalue() const {
640 Expression *expression() const {
643 void accept(AstVisitor *visitor) {
644 visitor->visit(this);
648 class ExpressionStatement : public Statement
650 Expression *expression_;
653 ExpressionStatement(Expression *expression)
654 : Statement(expression->pos()),
655 expression_(expression)
660 return kExpressionStatement;
662 Expression *expression() const {
665 void accept(AstVisitor *visitor) {
666 visitor->visit(this);
670 class BlockStatement : public Statement
673 StatementList *statements_;
676 BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
679 statements_(statements)
684 return kBlockStatement;
686 Scope *scope() const {
689 StatementList *statements() const {
692 void accept(AstVisitor *visitor) {
693 visitor->visit(this);
697 typedef PoolList<Parameter *> ParameterList;
699 class FunctionStatement : public Statement
704 ParameterList *parameters_;
705 bool explicitReturn_;
706 ScopedRoot<String> tag_;
709 FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
710 ParameterList *parameters, Handle<String> returnTag, bool explicitReturn)
715 parameters_(parameters),
716 explicitReturn_(explicitReturn)
721 return kFunctionStatement;
723 Scope *scope() const {
726 NamedFunction *fun() const {
729 Statement *body() const {
732 ParameterList *parameters() const {
735 void accept(AstVisitor *visitor) {
736 visitor->visit(this);
738 bool hasExplicitReturn() const {
739 return explicitReturn_;
741 String *returnTag() const {
746 class IfStatement : public Statement
748 Expression *condition_;
753 IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
755 condition_(condition),
764 Expression *condition() const {
767 Statement *ifTrue() const {
770 Statement *ifFalse() const {
773 void setIfFalse(Statement *ifFalse) {
776 void accept(AstVisitor *visitor) {
777 visitor->visit(this);
781 class EnumStatement : public Statement
783 ScopedRoot<String> name_;
790 Entry(NamedConstant *name, Expression *expr)
797 typedef PoolList<Entry> EntryList;
800 EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
808 return kEnumStatement;
810 String *name() const {
813 EntryList *entries() const {
816 void accept(AstVisitor *visitor) {
817 visitor->visit(this);
824 class IncDecExpression : public Expression
827 Expression *expression_;
831 IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
834 expression_(expression),
840 return kIncDecExpression;
842 TokenKind token() const {
845 Expression *expression() const {
848 bool postfix() const {
851 void accept(AstVisitor *visitor) {
852 visitor->visit(this);
858 typedef PoolList<NameProxy *> NameProxyList;
860 class ParseTree : public PoolObject
862 StatementList *statements_;
864 NameProxyList *unbound_;
867 ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
868 : statements_(statements),
876 StatementList *statements() const {
879 Scope *scope() const {
882 NameProxyList *unbound() const {
889 #endif // _include_jitcraft_ast_h_