src/AST.h
author David Anderson <dvander@alliedmods.net>
Sun Jul 29 19:37:47 2012 -0700 (2012-07-29)
changeset 135 72912cf0dd18
parent 133 7797936ba34c
child 136 7b32fc1bf153
permissions -rw-r--r--
Support TOK_CONST as a declarator in the parser.
dvander@132
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@132
     2
 *
dvander@0
     3
 * Copyright (C) 2012 David Anderson
dvander@0
     4
 *
dvander@132
     5
 * This file is part of SourcePawn.
dvander@0
     6
 *
dvander@132
     7
 * SourcePawn is free software: you can redistribute it and/or modify it under
dvander@0
     8
 * the terms of the GNU General Public License as published by the Free
dvander@0
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
    10
 * any later version.
dvander@0
    11
 * 
dvander@132
    12
 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    15
 *
dvander@0
    16
 * You should have received a copy of the GNU General Public License along with
dvander@132
    17
 * SourcePawn. If not, see http://www.gnu.org/licenses/.
dvander@0
    18
 */
dvander@0
    19
#ifndef _include_jitcraft_ast_h_
dvander@0
    20
#define _include_jitcraft_ast_h_
dvander@0
    21
dvander@0
    22
#include "PoolAllocator.h"
dvander@0
    23
#include "Token.h"
dvander@0
    24
#include "NameBinding.h"
dvander@55
    25
#include "Vector.h"
dvander@0
    26
dvander@59
    27
namespace ke {
dvander@0
    28
dvander@0
    29
#define ASTKINDS(_)             \
dvander@0
    30
    _(VariableDeclaration)      \
dvander@0
    31
    _(ForStatement)             \
dvander@0
    32
    _(ReturnStatement)          \
dvander@4
    33
    _(IntegerLiteral)           \
dvander@4
    34
    _(FloatLiteral)             \
dvander@21
    35
    _(StringLiteral)            \
dvander@0
    36
    _(BinaryExpression)         \
dvander@0
    37
    _(BlockStatement)           \
dvander@0
    38
    _(Assignment)               \
dvander@0
    39
    _(NameProxy)                \
dvander@0
    40
    _(ExpressionStatement)      \
dvander@0
    41
    _(FunctionStatement)        \
dvander@0
    42
    _(CallExpression)           \
dvander@0
    43
    _(IfStatement)              \
dvander@2
    44
    _(IndexExpression)          \
dvander@9
    45
    _(EnumStatement)            \
dvander@10
    46
    _(WhileStatement)           \
dvander@10
    47
    _(BreakStatement)           \
dvander@23
    48
    _(ContinueStatement)        \
dvander@78
    49
    _(IncDecExpression)         \
dvander@83
    50
    _(UnaryExpression)          \
dvander@83
    51
    _(TernaryExpression)
dvander@0
    52
dvander@0
    53
// Forward declarations.
dvander@0
    54
#define _(name) class name;
dvander@0
    55
ASTKINDS(_)
dvander@0
    56
#undef _
dvander@0
    57
dvander@0
    58
class AstVisitor;
dvander@0
    59
dvander@0
    60
// Interface for AST nodes.
dvander@0
    61
class AstNode : public PoolObject
dvander@0
    62
{
dvander@25
    63
    SourcePosition pos_;
dvander@25
    64
dvander@0
    65
  public:
dvander@0
    66
    enum Kind {
dvander@0
    67
#       define _(name) k##name,
dvander@0
    68
        ASTKINDS(_)
dvander@0
    69
#       undef _
dvander@0
    70
        AstKind_Invalid
dvander@0
    71
    };
dvander@25
    72
dvander@25
    73
    AstNode(const SourcePosition &pos)
dvander@25
    74
      : pos_(pos)
dvander@25
    75
    {
dvander@25
    76
    }
dvander@0
    77
    
dvander@0
    78
    virtual Kind kind() const = 0;
dvander@0
    79
dvander@0
    80
#define _(name)     bool is##name() { return kind() == k##name; }                   \
dvander@0
    81
                    name *to##name() { assert(is##name()); return (name *)this; }
dvander@0
    82
    ASTKINDS(_)
dvander@0
    83
#undef _
dvander@0
    84
dvander@0
    85
    virtual void accept(AstVisitor *visitor) = 0;
dvander@25
    86
dvander@25
    87
    const SourcePosition &pos() const {
dvander@25
    88
        return pos_;
dvander@25
    89
    }
dvander@0
    90
};
dvander@0
    91
dvander@0
    92
class AstVisitor
dvander@0
    93
{
dvander@0
    94
  public:
dvander@0
    95
#define _(name) virtual void visit(name *node) = 0;
dvander@0
    96
    ASTKINDS(_)
dvander@0
    97
#undef _
dvander@0
    98
};
dvander@0
    99
dvander@0
   100
class NameLocation
dvander@0
   101
{
dvander@0
   102
  public:
dvander@0
   103
    enum Kind {
dvander@0
   104
        LOCAL
dvander@0
   105
    };
dvander@0
   106
dvander@0
   107
    static NameLocation Local(VariableDeclaration *decl) {
dvander@0
   108
        NameLocation loc;
dvander@0
   109
        loc.kind_ = LOCAL;
dvander@0
   110
        loc.u_.decl = decl;
dvander@0
   111
        return loc;
dvander@0
   112
    }
dvander@0
   113
dvander@0
   114
    Kind kind() const {
dvander@0
   115
        return kind_;
dvander@0
   116
    }
dvander@0
   117
dvander@0
   118
    VariableDeclaration *local() const {
dvander@0
   119
        assert(kind() == LOCAL);
dvander@0
   120
        return u_.decl;
dvander@0
   121
    }
dvander@0
   122
dvander@0
   123
  private:
dvander@0
   124
    Kind kind_;
dvander@0
   125
    union {
dvander@0
   126
        VariableDeclaration *decl;
dvander@0
   127
    } u_;
dvander@0
   128
};
dvander@0
   129
dvander@0
   130
class Statement : public AstNode
dvander@0
   131
{
dvander@25
   132
  public:
dvander@25
   133
    Statement(const SourcePosition &pos)
dvander@25
   134
      : AstNode(pos)
dvander@25
   135
    {
dvander@25
   136
    }
dvander@0
   137
};
dvander@0
   138
dvander@0
   139
class Expression : public AstNode
dvander@0
   140
{
dvander@29
   141
    ScopedRoot<Type> type_;
dvander@0
   142
dvander@0
   143
  public:
dvander@25
   144
    Expression(const SourcePosition &pos)
dvander@25
   145
      : AstNode(pos),
dvander@25
   146
        type_(NULL)
dvander@0
   147
    {
dvander@0
   148
    }
dvander@0
   149
dvander@0
   150
    void setType(Type *type) {
dvander@0
   151
        type_ = type;
dvander@0
   152
    }
dvander@0
   153
    Type *type() const {
dvander@0
   154
        return type_;
dvander@0
   155
    }
dvander@0
   156
};
dvander@0
   157
dvander@0
   158
typedef PoolList<Statement *> StatementList;
dvander@56
   159
typedef PoolList<Expression *> ExpressionList;
dvander@0
   160
dvander@25
   161
class VariableDeclaration : public Statement
dvander@0
   162
{
dvander@0
   163
    Variable *variable_;
dvander@0
   164
    Expression *initialization_;
dvander@0
   165
    ExpressionList *postDimensions_;
dvander@54
   166
    ScopedRoot<String> tag_;
dvander@135
   167
    TokenKind declarator_;
dvander@0
   168
dvander@0
   169
  public:
dvander@135
   170
    VariableDeclaration(const SourcePosition &pos, TokenKind declarator, Variable *var,
dvander@135
   171
                        Handle<String> tag, ExpressionList *postDimensions,
dvander@135
   172
                        Expression *initialization)
dvander@25
   173
      : Statement(pos),
dvander@25
   174
        variable_(var),
dvander@28
   175
        initialization_(initialization),
dvander@0
   176
        postDimensions_(postDimensions),
dvander@4
   177
        tag_(tag)
dvander@0
   178
    {
dvander@0
   179
    }
dvander@0
   180
dvander@54
   181
    String *tag() const {
dvander@4
   182
        return tag_;
dvander@4
   183
    }
dvander@0
   184
    Kind kind() const {
dvander@0
   185
        return kVariableDeclaration;
dvander@0
   186
    }
dvander@0
   187
    Variable *variable() const {
dvander@0
   188
        return variable_;
dvander@0
   189
    }
dvander@0
   190
    Expression *initialization() const {
dvander@0
   191
        return initialization_;
dvander@0
   192
    }
dvander@0
   193
    ExpressionList *postDimensions() const {
dvander@0
   194
        return postDimensions_;
dvander@0
   195
    }
dvander@0
   196
    void accept(AstVisitor *visitor) {
dvander@0
   197
        visitor->visit(this);
dvander@0
   198
    }
dvander@135
   199
    TokenKind declarator() const {
dvander@135
   200
        return declarator_;
dvander@135
   201
    }
dvander@0
   202
};
dvander@0
   203
dvander@14
   204
class Parameter : public PoolObject
dvander@14
   205
{
dvander@14
   206
    Variable *variable_;
dvander@54
   207
    ScopedRoot<String> tag_;
dvander@14
   208
    bool reference_;
dvander@67
   209
    bool const_;
dvander@66
   210
    ExpressionList *dimensions_;
dvander@133
   211
    Expression *initializer_;
dvander@14
   212
dvander@14
   213
  public:
dvander@133
   214
    Parameter(Variable *var, Handle<String> tag, bool reference, bool isConst,
dvander@133
   215
              ExpressionList *dimensions, Expression *initializer)
dvander@14
   216
      : variable_(var),
dvander@14
   217
        tag_(tag),
dvander@66
   218
        reference_(reference),
dvander@67
   219
        const_(isConst),
dvander@133
   220
        dimensions_(dimensions),
dvander@133
   221
        initializer_(initializer)
dvander@14
   222
    {
dvander@14
   223
    }
dvander@14
   224
dvander@54
   225
    String *tag() const {
dvander@14
   226
        return tag_;
dvander@14
   227
    }
dvander@14
   228
    Variable *variable() const {
dvander@14
   229
        return variable_;
dvander@14
   230
    }
dvander@14
   231
    bool reference() const {
dvander@14
   232
        return reference_;
dvander@14
   233
    }
dvander@66
   234
    ExpressionList *dimensions() const {
dvander@66
   235
        return dimensions_;
dvander@66
   236
    }
dvander@67
   237
    bool isConst() const {
dvander@67
   238
        return const_;
dvander@67
   239
    }
dvander@133
   240
    Expression *initializer() const {
dvander@133
   241
        return initializer_;
dvander@133
   242
    }
dvander@14
   243
};
dvander@14
   244
dvander@0
   245
class NameProxy : public Expression
dvander@0
   246
{
dvander@54
   247
    ScopedRoot<String> name_;
dvander@0
   248
    BoundName *binding_;
dvander@0
   249
dvander@0
   250
  public:
dvander@54
   251
    NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
dvander@25
   252
      : Expression(pos),
dvander@25
   253
        name_(name),
dvander@0
   254
        binding_(binding)
dvander@0
   255
    {
dvander@0
   256
    }
dvander@0
   257
dvander@0
   258
    Kind kind() const {
dvander@0
   259
        return kNameProxy;
dvander@0
   260
    }
dvander@54
   261
    String *name() const {
dvander@0
   262
        return name_;
dvander@0
   263
    }
dvander@0
   264
    void accept(AstVisitor *visitor) {
dvander@0
   265
        visitor->visit(this);
dvander@0
   266
    }
dvander@0
   267
    BoundName *binding() const {
dvander@0
   268
        return binding_;
dvander@0
   269
    }
dvander@0
   270
    void bind(BoundName *name) {
dvander@0
   271
        assert(!binding());
dvander@0
   272
        binding_ = name;
dvander@0
   273
    }
dvander@0
   274
};
dvander@0
   275
dvander@4
   276
class IntegerLiteral : public Expression
dvander@0
   277
{
dvander@0
   278
    int value_;
dvander@0
   279
dvander@0
   280
  public:
dvander@25
   281
    IntegerLiteral(const SourcePosition &pos, int value)
dvander@25
   282
      : Expression(pos),
dvander@25
   283
        value_(value)
dvander@0
   284
    {
dvander@0
   285
    }
dvander@0
   286
dvander@0
   287
    Kind kind() const {
dvander@4
   288
        return kIntegerLiteral;
dvander@0
   289
    }
dvander@0
   290
    int value() const {
dvander@0
   291
        return value_;
dvander@0
   292
    }
dvander@0
   293
    void accept(AstVisitor *visitor) {
dvander@0
   294
        visitor->visit(this);
dvander@0
   295
    }
dvander@0
   296
};
dvander@0
   297
dvander@4
   298
class FloatLiteral : public Expression
dvander@4
   299
{
dvander@4
   300
    double value_;
dvander@4
   301
dvander@4
   302
  public:
dvander@25
   303
    FloatLiteral(const SourcePosition &pos, double value)
dvander@25
   304
      : Expression(pos),
dvander@25
   305
        value_(value)
dvander@4
   306
    {
dvander@4
   307
    }
dvander@4
   308
dvander@4
   309
    Kind kind() const {
dvander@4
   310
        return kFloatLiteral;
dvander@4
   311
    }
dvander@4
   312
    double value() const {
dvander@4
   313
        return value_;
dvander@4
   314
    }
dvander@4
   315
    void accept(AstVisitor *visitor) {
dvander@4
   316
        visitor->visit(this);
dvander@4
   317
    }
dvander@4
   318
};
dvander@4
   319
dvander@21
   320
class StringLiteral : public Expression
dvander@21
   321
{
dvander@29
   322
    ScopedRoot<ByteArray> string_;
dvander@21
   323
dvander@21
   324
  public:
dvander@25
   325
    StringLiteral(const SourcePosition &pos, ByteArray *array)
dvander@25
   326
      : Expression(pos),
dvander@25
   327
        string_(array)
dvander@21
   328
    {
dvander@21
   329
    }
dvander@21
   330
dvander@21
   331
    Kind kind() const {
dvander@21
   332
        return kStringLiteral;
dvander@21
   333
    }
dvander@21
   334
    ByteArray *string() const {
dvander@21
   335
        return string_;
dvander@21
   336
    }
dvander@21
   337
    void accept(AstVisitor *visitor) {
dvander@21
   338
        visitor->visit(this);
dvander@21
   339
    }
dvander@21
   340
};
dvander@21
   341
dvander@78
   342
class UnaryExpression : public Expression
dvander@78
   343
{
dvander@78
   344
    Expression *expression_;
dvander@78
   345
    TokenKind token_;
dvander@78
   346
dvander@78
   347
  public:
dvander@78
   348
    UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
dvander@78
   349
      : Expression(pos),
dvander@78
   350
        expression_(expr),
dvander@78
   351
        token_(token)
dvander@78
   352
    {
dvander@78
   353
    }
dvander@78
   354
dvander@78
   355
    Kind kind() const {
dvander@79
   356
        return kUnaryExpression;
dvander@78
   357
    }
dvander@78
   358
    Expression *expression() const {
dvander@78
   359
        return expression_;
dvander@78
   360
    }
dvander@78
   361
    TokenKind token() const {
dvander@78
   362
        return token_;
dvander@78
   363
    }
dvander@78
   364
    void accept(AstVisitor *visitor) {
dvander@78
   365
        visitor->visit(this);
dvander@78
   366
    }
dvander@78
   367
};
dvander@78
   368
dvander@0
   369
class BinaryExpression : public Expression
dvander@0
   370
{
dvander@0
   371
    Expression *left_;
dvander@0
   372
    Expression *right_;
dvander@0
   373
    TokenKind token_;
dvander@0
   374
dvander@0
   375
  public:
dvander@25
   376
    BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   377
      : Expression(pos),
dvander@0
   378
        left_(left),
dvander@28
   379
        right_(right),
dvander@28
   380
        token_(token)
dvander@0
   381
    {
dvander@0
   382
    }
dvander@0
   383
dvander@0
   384
    Kind kind() const {
dvander@0
   385
        return kBinaryExpression;
dvander@0
   386
    }
dvander@0
   387
    Expression *left() const {
dvander@0
   388
        return left_;
dvander@0
   389
    }
dvander@0
   390
    Expression *right() const {
dvander@0
   391
        return right_;
dvander@0
   392
    }
dvander@0
   393
    TokenKind token() const {
dvander@0
   394
        return token_;
dvander@0
   395
    }
dvander@0
   396
    void accept(AstVisitor *visitor) {
dvander@0
   397
        visitor->visit(this);
dvander@0
   398
    }
dvander@0
   399
};
dvander@0
   400
dvander@83
   401
class TernaryExpression : public Expression
dvander@83
   402
{
dvander@83
   403
    Expression *condition_;
dvander@83
   404
    Expression *left_;
dvander@83
   405
    Expression *right_;
dvander@83
   406
dvander@83
   407
  public:
dvander@83
   408
    TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
dvander@83
   409
      : Expression(pos),
dvander@83
   410
        condition_(condition),
dvander@83
   411
        left_(left),
dvander@83
   412
        right_(right)
dvander@83
   413
    {
dvander@83
   414
    }
dvander@83
   415
dvander@83
   416
    Kind kind() const {
dvander@83
   417
        return kTernaryExpression;
dvander@83
   418
    }
dvander@83
   419
    Expression *condition() const {
dvander@83
   420
        return condition_;
dvander@83
   421
    }
dvander@83
   422
    Expression *left() const {
dvander@83
   423
        return left_;
dvander@83
   424
    }
dvander@83
   425
    Expression *right() const {
dvander@83
   426
        return right_;
dvander@83
   427
    }
dvander@83
   428
    void accept(AstVisitor *visitor) {
dvander@83
   429
        visitor->visit(this);
dvander@83
   430
    }
dvander@83
   431
};
dvander@83
   432
dvander@0
   433
class IndexExpression : public Expression
dvander@0
   434
{
dvander@0
   435
    Expression *left_;
dvander@0
   436
    Expression *right_;
dvander@0
   437
dvander@0
   438
  public:
dvander@25
   439
    IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
dvander@25
   440
      : Expression(pos),
dvander@25
   441
        left_(left),
dvander@0
   442
        right_(right)
dvander@0
   443
    {
dvander@0
   444
    }
dvander@0
   445
dvander@0
   446
    Kind kind() const {
dvander@0
   447
        return kIndexExpression;
dvander@0
   448
    }
dvander@0
   449
    Expression *left() const {
dvander@0
   450
        return left_;
dvander@0
   451
    }
dvander@0
   452
    Expression *right() const {
dvander@0
   453
        return right_;
dvander@0
   454
    }
dvander@0
   455
    void accept(AstVisitor *visitor) {
dvander@0
   456
        visitor->visit(this);
dvander@0
   457
    }
dvander@0
   458
};
dvander@0
   459
dvander@0
   460
class CallExpression : public Expression
dvander@0
   461
{
dvander@0
   462
    Expression *callee_;
dvander@0
   463
    ExpressionList *arguments_;
dvander@0
   464
dvander@0
   465
  public:
dvander@25
   466
    CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
dvander@25
   467
      : Expression(pos),
dvander@25
   468
        callee_(callee),
dvander@0
   469
        arguments_(arguments)
dvander@0
   470
    {
dvander@0
   471
    }
dvander@0
   472
dvander@0
   473
    Kind kind() const {
dvander@0
   474
        return kCallExpression;
dvander@0
   475
    }
dvander@0
   476
    Expression *callee() const {
dvander@0
   477
        return callee_;
dvander@0
   478
    }
dvander@0
   479
    ExpressionList *arguments() const {
dvander@0
   480
        return arguments_;
dvander@0
   481
    }
dvander@0
   482
    void accept(AstVisitor *visitor) {
dvander@0
   483
        visitor->visit(this);
dvander@0
   484
    }
dvander@0
   485
};
dvander@0
   486
dvander@0
   487
class ForStatement : public Statement
dvander@0
   488
{
dvander@0
   489
    Scope *scope_;
dvander@22
   490
    Statement *initialization_;
dvander@0
   491
    Expression *condition_;
dvander@0
   492
    Statement *update_;
dvander@0
   493
    Statement *body_;
dvander@0
   494
dvander@0
   495
  public:
dvander@25
   496
    ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
dvander@0
   497
                 Expression *condition, Statement *update, Statement *body)
dvander@25
   498
      : Statement(pos),
dvander@25
   499
        scope_(scope),
dvander@22
   500
        initialization_(initialization),
dvander@0
   501
        condition_(condition),
dvander@0
   502
        update_(update),
dvander@0
   503
        body_(body)
dvander@0
   504
    {
dvander@0
   505
    }
dvander@0
   506
dvander@0
   507
    Kind kind() const {
dvander@0
   508
        return kForStatement;
dvander@0
   509
    }
dvander@22
   510
    Statement *initialization() const {
dvander@22
   511
        return initialization_;
dvander@0
   512
    }
dvander@0
   513
    Scope *scope() const {
dvander@0
   514
        return scope_;
dvander@0
   515
    }
dvander@0
   516
    Expression *condition() const {
dvander@0
   517
        return condition_;
dvander@0
   518
    }
dvander@0
   519
    Statement *update() const {
dvander@0
   520
        return update_;
dvander@0
   521
    }
dvander@0
   522
    Statement *body() const {
dvander@0
   523
        return body_;
dvander@0
   524
    }
dvander@0
   525
    void accept(AstVisitor *visitor) {
dvander@0
   526
        visitor->visit(this);
dvander@0
   527
    }
dvander@0
   528
};
dvander@0
   529
dvander@9
   530
class WhileStatement : public Statement
dvander@9
   531
{
dvander@9
   532
    TokenKind token_;
dvander@9
   533
    Expression *condition_;
dvander@9
   534
    Statement *body_;
dvander@9
   535
dvander@9
   536
  public:
dvander@25
   537
    WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
dvander@25
   538
      : Statement(pos),
dvander@25
   539
        token_(kind),
dvander@9
   540
        condition_(condition),
dvander@9
   541
        body_(body)
dvander@9
   542
    {
dvander@9
   543
    }
dvander@9
   544
    
dvander@9
   545
    Kind kind() const {
dvander@9
   546
        return kWhileStatement;
dvander@9
   547
    }
dvander@9
   548
    TokenKind token() const {
dvander@9
   549
        return token_;
dvander@9
   550
    }
dvander@9
   551
    Expression *condition() const {
dvander@9
   552
        return condition_;
dvander@9
   553
    }
dvander@9
   554
    Statement *body() const {
dvander@9
   555
        return body_;
dvander@9
   556
    }
dvander@9
   557
    void accept(AstVisitor *visitor) {
dvander@9
   558
        visitor->visit(this);
dvander@9
   559
    }
dvander@9
   560
};
dvander@9
   561
dvander@0
   562
class ReturnStatement : public Statement
dvander@0
   563
{
dvander@0
   564
    Expression *expression_;
dvander@0
   565
dvander@0
   566
  public:
dvander@25
   567
    ReturnStatement(const SourcePosition &pos, Expression *expression)
dvander@25
   568
      : Statement(pos),
dvander@25
   569
        expression_(expression)
dvander@0
   570
    {
dvander@0
   571
    }
dvander@0
   572
dvander@0
   573
    Kind kind() const {
dvander@0
   574
        return kReturnStatement;
dvander@0
   575
    }
dvander@0
   576
    Expression *expression() const {
dvander@0
   577
        return expression_;
dvander@0
   578
    }
dvander@0
   579
    void accept(AstVisitor *visitor) {
dvander@0
   580
        visitor->visit(this);
dvander@0
   581
    }
dvander@0
   582
};
dvander@0
   583
dvander@10
   584
class BreakStatement : public Statement
dvander@10
   585
{
dvander@10
   586
  public:
dvander@25
   587
    BreakStatement(const SourcePosition &pos)
dvander@25
   588
      : Statement(pos)
dvander@10
   589
    {
dvander@10
   590
    }
dvander@10
   591
dvander@10
   592
    Kind kind() const {
dvander@10
   593
        return kBreakStatement;
dvander@10
   594
    }
dvander@10
   595
    void accept(AstVisitor *visitor) {
dvander@10
   596
        visitor->visit(this);
dvander@10
   597
    }
dvander@10
   598
};
dvander@10
   599
dvander@10
   600
class ContinueStatement : public Statement
dvander@10
   601
{
dvander@10
   602
  public:
dvander@25
   603
    ContinueStatement(const SourcePosition &pos)
dvander@25
   604
      : Statement(pos)
dvander@10
   605
    {
dvander@10
   606
    }
dvander@10
   607
dvander@10
   608
    Kind kind() const {
dvander@10
   609
        return kContinueStatement;
dvander@10
   610
    }
dvander@10
   611
    void accept(AstVisitor *visitor) {
dvander@10
   612
        visitor->visit(this);
dvander@10
   613
    }
dvander@10
   614
};
dvander@10
   615
dvander@0
   616
class Assignment : public Expression
dvander@0
   617
{
dvander@22
   618
    TokenKind token_;
dvander@0
   619
    Expression *lvalue_;
dvander@0
   620
    Expression *expression_;
dvander@0
   621
dvander@0
   622
  public:
dvander@25
   623
    Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   624
      : Expression(pos),
dvander@25
   625
        token_(token),
dvander@22
   626
        lvalue_(left),
dvander@0
   627
        expression_(right)
dvander@0
   628
    {
dvander@0
   629
    }
dvander@0
   630
dvander@0
   631
    Kind kind() const {
dvander@0
   632
        return kAssignment;
dvander@0
   633
    }
dvander@22
   634
    TokenKind token() const {
dvander@22
   635
        return token_;
dvander@22
   636
    }
dvander@0
   637
    Expression *lvalue() const {
dvander@0
   638
        return lvalue_;
dvander@0
   639
    }
dvander@0
   640
    Expression *expression() const {
dvander@0
   641
        return expression_;
dvander@0
   642
    }
dvander@0
   643
    void accept(AstVisitor *visitor) {
dvander@0
   644
        visitor->visit(this);
dvander@0
   645
    }
dvander@0
   646
};
dvander@0
   647
dvander@0
   648
class ExpressionStatement : public Statement
dvander@0
   649
{
dvander@0
   650
    Expression *expression_;
dvander@0
   651
dvander@0
   652
  public:
dvander@0
   653
    ExpressionStatement(Expression *expression)
dvander@25
   654
      : Statement(expression->pos()),
dvander@25
   655
        expression_(expression)
dvander@0
   656
    {
dvander@0
   657
    }
dvander@0
   658
dvander@0
   659
    Kind kind() const {
dvander@0
   660
        return kExpressionStatement;
dvander@0
   661
    }
dvander@0
   662
    Expression *expression() const {
dvander@0
   663
        return expression_;
dvander@0
   664
    }
dvander@0
   665
    void accept(AstVisitor *visitor) {
dvander@0
   666
        visitor->visit(this);
dvander@0
   667
    }
dvander@0
   668
};
dvander@0
   669
dvander@0
   670
class BlockStatement : public Statement
dvander@0
   671
{
dvander@0
   672
    Scope *scope_;
dvander@0
   673
    StatementList *statements_;
dvander@0
   674
dvander@0
   675
  public:
dvander@25
   676
    BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
dvander@25
   677
      : Statement(pos),
dvander@25
   678
        scope_(scope),
dvander@0
   679
        statements_(statements)
dvander@0
   680
    {
dvander@0
   681
    }
dvander@0
   682
dvander@0
   683
    Kind kind() const {
dvander@0
   684
        return kBlockStatement;
dvander@0
   685
    }
dvander@0
   686
    Scope *scope() const {
dvander@0
   687
        return scope_;
dvander@0
   688
    }
dvander@0
   689
    StatementList *statements() const {
dvander@0
   690
        return statements_;
dvander@0
   691
    }
dvander@0
   692
    void accept(AstVisitor *visitor) {
dvander@0
   693
        visitor->visit(this);
dvander@0
   694
    }
dvander@0
   695
};
dvander@0
   696
dvander@57
   697
typedef PoolList<Parameter *> ParameterList;
dvander@14
   698
dvander@0
   699
class FunctionStatement : public Statement
dvander@0
   700
{
dvander@0
   701
    Scope *scope_;
dvander@0
   702
    NamedFunction *fun_;
dvander@0
   703
    Statement *body_;
dvander@14
   704
    ParameterList *parameters_;
dvander@71
   705
    bool explicitReturn_;
dvander@132
   706
    ScopedRoot<String> tag_;
dvander@0
   707
dvander@0
   708
  public:
dvander@25
   709
    FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
dvander@132
   710
                      ParameterList *parameters, Handle<String> returnTag, bool explicitReturn)
dvander@25
   711
      : Statement(pos),
dvander@25
   712
        scope_(scope),
dvander@0
   713
        fun_(fun),
dvander@14
   714
        body_(body),
dvander@71
   715
        parameters_(parameters),
dvander@71
   716
        explicitReturn_(explicitReturn)
dvander@0
   717
    {
dvander@0
   718
    }
dvander@0
   719
dvander@0
   720
    Kind kind() const {
dvander@0
   721
        return kFunctionStatement;
dvander@0
   722
    }
dvander@0
   723
    Scope *scope() const {
dvander@0
   724
        return scope_;
dvander@0
   725
    }
dvander@0
   726
    NamedFunction *fun() const {
dvander@0
   727
        return fun_;
dvander@0
   728
    }
dvander@0
   729
    Statement *body() const {
dvander@0
   730
        return body_;
dvander@0
   731
    }
dvander@14
   732
    ParameterList *parameters() const {
dvander@14
   733
        return parameters_;
dvander@14
   734
    }
dvander@0
   735
    void accept(AstVisitor *visitor) {
dvander@0
   736
        visitor->visit(this);
dvander@0
   737
    }
dvander@71
   738
    bool hasExplicitReturn() const {
dvander@71
   739
        return explicitReturn_;
dvander@71
   740
    }
dvander@132
   741
    String *returnTag() const {
dvander@132
   742
        return tag_;
dvander@132
   743
    }
dvander@0
   744
};
dvander@0
   745
dvander@0
   746
class IfStatement : public Statement
dvander@0
   747
{
dvander@0
   748
    Expression *condition_;
dvander@0
   749
    Statement *ifTrue_;
dvander@0
   750
    Statement *ifFalse_;
dvander@0
   751
dvander@0
   752
  public:
dvander@25
   753
    IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
dvander@25
   754
      : Statement(pos),
dvander@25
   755
        condition_(condition),
dvander@0
   756
        ifTrue_(ifTrue),
dvander@0
   757
        ifFalse_(NULL)
dvander@0
   758
    {
dvander@0
   759
    }
dvander@0
   760
dvander@0
   761
    Kind kind() const {
dvander@0
   762
        return kIfStatement;
dvander@0
   763
    }
dvander@0
   764
    Expression *condition() const {
dvander@0
   765
        return condition_;
dvander@0
   766
    }
dvander@0
   767
    Statement *ifTrue() const {
dvander@0
   768
        return ifTrue_;
dvander@0
   769
    }
dvander@0
   770
    Statement *ifFalse() const {
dvander@0
   771
        return ifFalse_;
dvander@0
   772
    }
dvander@0
   773
    void setIfFalse(Statement *ifFalse) {
dvander@0
   774
        ifFalse_ = ifFalse;
dvander@0
   775
    }
dvander@0
   776
    void accept(AstVisitor *visitor) {
dvander@0
   777
        visitor->visit(this);
dvander@0
   778
    }
dvander@0
   779
};
dvander@0
   780
dvander@2
   781
class EnumStatement : public Statement
dvander@2
   782
{
dvander@54
   783
    ScopedRoot<String> name_;
dvander@2
   784
dvander@2
   785
  public:
dvander@2
   786
    struct Entry {
dvander@2
   787
        NamedConstant *name;
dvander@2
   788
        Expression *expr;
dvander@2
   789
dvander@2
   790
        Entry(NamedConstant *name, Expression *expr)
dvander@2
   791
          : name(name),
dvander@2
   792
            expr(expr)
dvander@2
   793
        {
dvander@2
   794
        }
dvander@2
   795
    };
dvander@2
   796
dvander@57
   797
    typedef PoolList<Entry> EntryList;
dvander@2
   798
dvander@2
   799
  public:
dvander@54
   800
    EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
dvander@25
   801
      : Statement(pos),
dvander@25
   802
        name_(name),
dvander@2
   803
        entries_(entries)
dvander@2
   804
    {
dvander@2
   805
    }
dvander@2
   806
dvander@2
   807
    Kind kind() const {
dvander@2
   808
        return kEnumStatement;
dvander@2
   809
    }
dvander@54
   810
    String *name() const {
dvander@2
   811
        return name_;
dvander@2
   812
    }
dvander@2
   813
    EntryList *entries() const {
dvander@2
   814
        return entries_;
dvander@2
   815
    }
dvander@2
   816
    void accept(AstVisitor *visitor) {
dvander@2
   817
        visitor->visit(this);
dvander@2
   818
    }
dvander@2
   819
dvander@2
   820
  private:
dvander@2
   821
    EntryList *entries_;
dvander@2
   822
};
dvander@2
   823
dvander@23
   824
class IncDecExpression : public Expression
dvander@23
   825
{
dvander@23
   826
    TokenKind token_;
dvander@23
   827
    Expression *expression_;
dvander@23
   828
    bool postfix_;
dvander@23
   829
dvander@23
   830
  public:
dvander@25
   831
    IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
dvander@25
   832
      : Expression(pos),
dvander@25
   833
        token_(token),
dvander@23
   834
        expression_(expression),
dvander@23
   835
        postfix_(postfix)
dvander@23
   836
    {
dvander@23
   837
    }
dvander@23
   838
dvander@23
   839
    Kind kind() const {
dvander@23
   840
        return kIncDecExpression;
dvander@23
   841
    }
dvander@23
   842
    TokenKind token() const {
dvander@23
   843
        return token_;
dvander@23
   844
    }
dvander@23
   845
    Expression *expression() const {
dvander@23
   846
        return expression_;
dvander@23
   847
    }
dvander@23
   848
    bool postfix() const {
dvander@23
   849
        return postfix_;
dvander@23
   850
    }
dvander@23
   851
    void accept(AstVisitor *visitor) {
dvander@23
   852
        visitor->visit(this);
dvander@23
   853
    }
dvander@23
   854
};
dvander@23
   855
dvander@0
   856
class Scope;
dvander@0
   857
dvander@57
   858
typedef PoolList<NameProxy *> NameProxyList;
dvander@0
   859
dvander@0
   860
class ParseTree : public PoolObject
dvander@0
   861
{
dvander@0
   862
    StatementList *statements_;
dvander@0
   863
    Scope *scope_;
dvander@0
   864
    NameProxyList *unbound_;
dvander@0
   865
dvander@0
   866
  public:
dvander@0
   867
    ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
dvander@0
   868
      : statements_(statements),
dvander@0
   869
        scope_(scope),
dvander@0
   870
        unbound_(unbound)
dvander@0
   871
    {
dvander@0
   872
    }
dvander@0
   873
dvander@0
   874
    void dump(FILE *fp);
dvander@0
   875
dvander@0
   876
    StatementList *statements() const {
dvander@0
   877
        return statements_;
dvander@0
   878
    }
dvander@0
   879
    Scope *scope() const {
dvander@0
   880
        return scope_;
dvander@0
   881
    }
dvander@0
   882
    NameProxyList *unbound() const {
dvander@0
   883
        return unbound_;
dvander@0
   884
    }
dvander@0
   885
};
dvander@0
   886
dvander@0
   887
}
dvander@0
   888
dvander@0
   889
#endif // _include_jitcraft_ast_h_