src/AST.h
author David Anderson <dvander@alliedmods.net>
Mon Jul 30 12:13:22 2012 -0700 (2012-07-30)
changeset 142 a000bafece09
parent 136 7b32fc1bf153
child 143 393f1b8ac8c3
permissions -rw-r--r--
Implement re-tag unary expression.
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@142
   346
    ScopedRoot<String> tag_;
dvander@78
   347
dvander@78
   348
  public:
dvander@78
   349
    UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
dvander@78
   350
      : Expression(pos),
dvander@78
   351
        expression_(expr),
dvander@78
   352
        token_(token)
dvander@78
   353
    {
dvander@78
   354
    }
dvander@78
   355
dvander@142
   356
    UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
dvander@142
   357
                    Handle<String> tag)
dvander@142
   358
      : Expression(pos),
dvander@142
   359
        expression_(expr),
dvander@142
   360
        token_(token),
dvander@142
   361
        tag_(tag)
dvander@142
   362
    {
dvander@142
   363
    }
dvander@142
   364
dvander@78
   365
    Kind kind() const {
dvander@79
   366
        return kUnaryExpression;
dvander@78
   367
    }
dvander@78
   368
    Expression *expression() const {
dvander@78
   369
        return expression_;
dvander@78
   370
    }
dvander@78
   371
    TokenKind token() const {
dvander@78
   372
        return token_;
dvander@78
   373
    }
dvander@142
   374
    String *tag() const {
dvander@142
   375
        return tag_;
dvander@142
   376
    }
dvander@78
   377
    void accept(AstVisitor *visitor) {
dvander@78
   378
        visitor->visit(this);
dvander@78
   379
    }
dvander@78
   380
};
dvander@78
   381
dvander@0
   382
class BinaryExpression : public Expression
dvander@0
   383
{
dvander@0
   384
    Expression *left_;
dvander@0
   385
    Expression *right_;
dvander@0
   386
    TokenKind token_;
dvander@0
   387
dvander@0
   388
  public:
dvander@25
   389
    BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   390
      : Expression(pos),
dvander@0
   391
        left_(left),
dvander@28
   392
        right_(right),
dvander@28
   393
        token_(token)
dvander@0
   394
    {
dvander@0
   395
    }
dvander@0
   396
dvander@0
   397
    Kind kind() const {
dvander@0
   398
        return kBinaryExpression;
dvander@0
   399
    }
dvander@0
   400
    Expression *left() const {
dvander@0
   401
        return left_;
dvander@0
   402
    }
dvander@0
   403
    Expression *right() const {
dvander@0
   404
        return right_;
dvander@0
   405
    }
dvander@0
   406
    TokenKind token() const {
dvander@0
   407
        return token_;
dvander@0
   408
    }
dvander@0
   409
    void accept(AstVisitor *visitor) {
dvander@0
   410
        visitor->visit(this);
dvander@0
   411
    }
dvander@0
   412
};
dvander@0
   413
dvander@83
   414
class TernaryExpression : public Expression
dvander@83
   415
{
dvander@83
   416
    Expression *condition_;
dvander@83
   417
    Expression *left_;
dvander@83
   418
    Expression *right_;
dvander@83
   419
dvander@83
   420
  public:
dvander@83
   421
    TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
dvander@83
   422
      : Expression(pos),
dvander@83
   423
        condition_(condition),
dvander@83
   424
        left_(left),
dvander@83
   425
        right_(right)
dvander@83
   426
    {
dvander@83
   427
    }
dvander@83
   428
dvander@83
   429
    Kind kind() const {
dvander@83
   430
        return kTernaryExpression;
dvander@83
   431
    }
dvander@83
   432
    Expression *condition() const {
dvander@83
   433
        return condition_;
dvander@83
   434
    }
dvander@83
   435
    Expression *left() const {
dvander@83
   436
        return left_;
dvander@83
   437
    }
dvander@83
   438
    Expression *right() const {
dvander@83
   439
        return right_;
dvander@83
   440
    }
dvander@83
   441
    void accept(AstVisitor *visitor) {
dvander@83
   442
        visitor->visit(this);
dvander@83
   443
    }
dvander@83
   444
};
dvander@83
   445
dvander@0
   446
class IndexExpression : public Expression
dvander@0
   447
{
dvander@0
   448
    Expression *left_;
dvander@0
   449
    Expression *right_;
dvander@0
   450
dvander@0
   451
  public:
dvander@25
   452
    IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
dvander@25
   453
      : Expression(pos),
dvander@25
   454
        left_(left),
dvander@0
   455
        right_(right)
dvander@0
   456
    {
dvander@0
   457
    }
dvander@0
   458
dvander@0
   459
    Kind kind() const {
dvander@0
   460
        return kIndexExpression;
dvander@0
   461
    }
dvander@0
   462
    Expression *left() const {
dvander@0
   463
        return left_;
dvander@0
   464
    }
dvander@0
   465
    Expression *right() const {
dvander@0
   466
        return right_;
dvander@0
   467
    }
dvander@0
   468
    void accept(AstVisitor *visitor) {
dvander@0
   469
        visitor->visit(this);
dvander@0
   470
    }
dvander@0
   471
};
dvander@0
   472
dvander@0
   473
class CallExpression : public Expression
dvander@0
   474
{
dvander@0
   475
    Expression *callee_;
dvander@0
   476
    ExpressionList *arguments_;
dvander@0
   477
dvander@0
   478
  public:
dvander@25
   479
    CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
dvander@25
   480
      : Expression(pos),
dvander@25
   481
        callee_(callee),
dvander@0
   482
        arguments_(arguments)
dvander@0
   483
    {
dvander@0
   484
    }
dvander@0
   485
dvander@0
   486
    Kind kind() const {
dvander@0
   487
        return kCallExpression;
dvander@0
   488
    }
dvander@0
   489
    Expression *callee() const {
dvander@0
   490
        return callee_;
dvander@0
   491
    }
dvander@0
   492
    ExpressionList *arguments() const {
dvander@0
   493
        return arguments_;
dvander@0
   494
    }
dvander@0
   495
    void accept(AstVisitor *visitor) {
dvander@0
   496
        visitor->visit(this);
dvander@0
   497
    }
dvander@0
   498
};
dvander@0
   499
dvander@0
   500
class ForStatement : public Statement
dvander@0
   501
{
dvander@0
   502
    Scope *scope_;
dvander@22
   503
    Statement *initialization_;
dvander@0
   504
    Expression *condition_;
dvander@0
   505
    Statement *update_;
dvander@0
   506
    Statement *body_;
dvander@0
   507
dvander@0
   508
  public:
dvander@25
   509
    ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
dvander@0
   510
                 Expression *condition, Statement *update, Statement *body)
dvander@25
   511
      : Statement(pos),
dvander@25
   512
        scope_(scope),
dvander@22
   513
        initialization_(initialization),
dvander@0
   514
        condition_(condition),
dvander@0
   515
        update_(update),
dvander@0
   516
        body_(body)
dvander@0
   517
    {
dvander@0
   518
    }
dvander@0
   519
dvander@0
   520
    Kind kind() const {
dvander@0
   521
        return kForStatement;
dvander@0
   522
    }
dvander@22
   523
    Statement *initialization() const {
dvander@22
   524
        return initialization_;
dvander@0
   525
    }
dvander@0
   526
    Scope *scope() const {
dvander@0
   527
        return scope_;
dvander@0
   528
    }
dvander@0
   529
    Expression *condition() const {
dvander@0
   530
        return condition_;
dvander@0
   531
    }
dvander@0
   532
    Statement *update() const {
dvander@0
   533
        return update_;
dvander@0
   534
    }
dvander@0
   535
    Statement *body() const {
dvander@0
   536
        return body_;
dvander@0
   537
    }
dvander@0
   538
    void accept(AstVisitor *visitor) {
dvander@0
   539
        visitor->visit(this);
dvander@0
   540
    }
dvander@0
   541
};
dvander@0
   542
dvander@9
   543
class WhileStatement : public Statement
dvander@9
   544
{
dvander@9
   545
    TokenKind token_;
dvander@9
   546
    Expression *condition_;
dvander@9
   547
    Statement *body_;
dvander@9
   548
dvander@9
   549
  public:
dvander@25
   550
    WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
dvander@25
   551
      : Statement(pos),
dvander@25
   552
        token_(kind),
dvander@9
   553
        condition_(condition),
dvander@9
   554
        body_(body)
dvander@9
   555
    {
dvander@9
   556
    }
dvander@9
   557
    
dvander@9
   558
    Kind kind() const {
dvander@9
   559
        return kWhileStatement;
dvander@9
   560
    }
dvander@9
   561
    TokenKind token() const {
dvander@9
   562
        return token_;
dvander@9
   563
    }
dvander@9
   564
    Expression *condition() const {
dvander@9
   565
        return condition_;
dvander@9
   566
    }
dvander@9
   567
    Statement *body() const {
dvander@9
   568
        return body_;
dvander@9
   569
    }
dvander@9
   570
    void accept(AstVisitor *visitor) {
dvander@9
   571
        visitor->visit(this);
dvander@9
   572
    }
dvander@9
   573
};
dvander@9
   574
dvander@0
   575
class ReturnStatement : public Statement
dvander@0
   576
{
dvander@0
   577
    Expression *expression_;
dvander@0
   578
dvander@0
   579
  public:
dvander@25
   580
    ReturnStatement(const SourcePosition &pos, Expression *expression)
dvander@25
   581
      : Statement(pos),
dvander@25
   582
        expression_(expression)
dvander@0
   583
    {
dvander@0
   584
    }
dvander@0
   585
dvander@0
   586
    Kind kind() const {
dvander@0
   587
        return kReturnStatement;
dvander@0
   588
    }
dvander@0
   589
    Expression *expression() const {
dvander@0
   590
        return expression_;
dvander@0
   591
    }
dvander@0
   592
    void accept(AstVisitor *visitor) {
dvander@0
   593
        visitor->visit(this);
dvander@0
   594
    }
dvander@0
   595
};
dvander@0
   596
dvander@10
   597
class BreakStatement : public Statement
dvander@10
   598
{
dvander@10
   599
  public:
dvander@25
   600
    BreakStatement(const SourcePosition &pos)
dvander@25
   601
      : Statement(pos)
dvander@10
   602
    {
dvander@10
   603
    }
dvander@10
   604
dvander@10
   605
    Kind kind() const {
dvander@10
   606
        return kBreakStatement;
dvander@10
   607
    }
dvander@10
   608
    void accept(AstVisitor *visitor) {
dvander@10
   609
        visitor->visit(this);
dvander@10
   610
    }
dvander@10
   611
};
dvander@10
   612
dvander@10
   613
class ContinueStatement : public Statement
dvander@10
   614
{
dvander@10
   615
  public:
dvander@25
   616
    ContinueStatement(const SourcePosition &pos)
dvander@25
   617
      : Statement(pos)
dvander@10
   618
    {
dvander@10
   619
    }
dvander@10
   620
dvander@10
   621
    Kind kind() const {
dvander@10
   622
        return kContinueStatement;
dvander@10
   623
    }
dvander@10
   624
    void accept(AstVisitor *visitor) {
dvander@10
   625
        visitor->visit(this);
dvander@10
   626
    }
dvander@10
   627
};
dvander@10
   628
dvander@0
   629
class Assignment : public Expression
dvander@0
   630
{
dvander@22
   631
    TokenKind token_;
dvander@0
   632
    Expression *lvalue_;
dvander@0
   633
    Expression *expression_;
dvander@0
   634
dvander@0
   635
  public:
dvander@25
   636
    Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   637
      : Expression(pos),
dvander@25
   638
        token_(token),
dvander@22
   639
        lvalue_(left),
dvander@0
   640
        expression_(right)
dvander@0
   641
    {
dvander@0
   642
    }
dvander@0
   643
dvander@0
   644
    Kind kind() const {
dvander@0
   645
        return kAssignment;
dvander@0
   646
    }
dvander@22
   647
    TokenKind token() const {
dvander@22
   648
        return token_;
dvander@22
   649
    }
dvander@0
   650
    Expression *lvalue() const {
dvander@0
   651
        return lvalue_;
dvander@0
   652
    }
dvander@0
   653
    Expression *expression() const {
dvander@0
   654
        return expression_;
dvander@0
   655
    }
dvander@0
   656
    void accept(AstVisitor *visitor) {
dvander@0
   657
        visitor->visit(this);
dvander@0
   658
    }
dvander@0
   659
};
dvander@0
   660
dvander@0
   661
class ExpressionStatement : public Statement
dvander@0
   662
{
dvander@0
   663
    Expression *expression_;
dvander@0
   664
dvander@0
   665
  public:
dvander@0
   666
    ExpressionStatement(Expression *expression)
dvander@25
   667
      : Statement(expression->pos()),
dvander@25
   668
        expression_(expression)
dvander@0
   669
    {
dvander@0
   670
    }
dvander@0
   671
dvander@0
   672
    Kind kind() const {
dvander@0
   673
        return kExpressionStatement;
dvander@0
   674
    }
dvander@0
   675
    Expression *expression() const {
dvander@0
   676
        return expression_;
dvander@0
   677
    }
dvander@0
   678
    void accept(AstVisitor *visitor) {
dvander@0
   679
        visitor->visit(this);
dvander@0
   680
    }
dvander@0
   681
};
dvander@0
   682
dvander@0
   683
class BlockStatement : public Statement
dvander@0
   684
{
dvander@0
   685
    Scope *scope_;
dvander@0
   686
    StatementList *statements_;
dvander@0
   687
dvander@0
   688
  public:
dvander@25
   689
    BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
dvander@25
   690
      : Statement(pos),
dvander@25
   691
        scope_(scope),
dvander@0
   692
        statements_(statements)
dvander@0
   693
    {
dvander@0
   694
    }
dvander@0
   695
dvander@0
   696
    Kind kind() const {
dvander@0
   697
        return kBlockStatement;
dvander@0
   698
    }
dvander@0
   699
    Scope *scope() const {
dvander@0
   700
        return scope_;
dvander@0
   701
    }
dvander@0
   702
    StatementList *statements() const {
dvander@0
   703
        return statements_;
dvander@0
   704
    }
dvander@0
   705
    void accept(AstVisitor *visitor) {
dvander@0
   706
        visitor->visit(this);
dvander@0
   707
    }
dvander@0
   708
};
dvander@0
   709
dvander@57
   710
typedef PoolList<Parameter *> ParameterList;
dvander@14
   711
dvander@0
   712
class FunctionStatement : public Statement
dvander@0
   713
{
dvander@0
   714
    Scope *scope_;
dvander@0
   715
    NamedFunction *fun_;
dvander@0
   716
    Statement *body_;
dvander@14
   717
    ParameterList *parameters_;
dvander@71
   718
    bool explicitReturn_;
dvander@132
   719
    ScopedRoot<String> tag_;
dvander@0
   720
dvander@0
   721
  public:
dvander@25
   722
    FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
dvander@132
   723
                      ParameterList *parameters, Handle<String> returnTag, bool explicitReturn)
dvander@25
   724
      : Statement(pos),
dvander@25
   725
        scope_(scope),
dvander@0
   726
        fun_(fun),
dvander@14
   727
        body_(body),
dvander@71
   728
        parameters_(parameters),
dvander@136
   729
        explicitReturn_(explicitReturn),
dvander@136
   730
        tag_(returnTag)
dvander@0
   731
    {
dvander@0
   732
    }
dvander@0
   733
dvander@0
   734
    Kind kind() const {
dvander@0
   735
        return kFunctionStatement;
dvander@0
   736
    }
dvander@0
   737
    Scope *scope() const {
dvander@0
   738
        return scope_;
dvander@0
   739
    }
dvander@0
   740
    NamedFunction *fun() const {
dvander@0
   741
        return fun_;
dvander@0
   742
    }
dvander@0
   743
    Statement *body() const {
dvander@0
   744
        return body_;
dvander@0
   745
    }
dvander@14
   746
    ParameterList *parameters() const {
dvander@14
   747
        return parameters_;
dvander@14
   748
    }
dvander@0
   749
    void accept(AstVisitor *visitor) {
dvander@0
   750
        visitor->visit(this);
dvander@0
   751
    }
dvander@71
   752
    bool hasExplicitReturn() const {
dvander@71
   753
        return explicitReturn_;
dvander@71
   754
    }
dvander@132
   755
    String *returnTag() const {
dvander@132
   756
        return tag_;
dvander@132
   757
    }
dvander@0
   758
};
dvander@0
   759
dvander@0
   760
class IfStatement : public Statement
dvander@0
   761
{
dvander@0
   762
    Expression *condition_;
dvander@0
   763
    Statement *ifTrue_;
dvander@0
   764
    Statement *ifFalse_;
dvander@0
   765
dvander@0
   766
  public:
dvander@25
   767
    IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
dvander@25
   768
      : Statement(pos),
dvander@25
   769
        condition_(condition),
dvander@0
   770
        ifTrue_(ifTrue),
dvander@0
   771
        ifFalse_(NULL)
dvander@0
   772
    {
dvander@0
   773
    }
dvander@0
   774
dvander@0
   775
    Kind kind() const {
dvander@0
   776
        return kIfStatement;
dvander@0
   777
    }
dvander@0
   778
    Expression *condition() const {
dvander@0
   779
        return condition_;
dvander@0
   780
    }
dvander@0
   781
    Statement *ifTrue() const {
dvander@0
   782
        return ifTrue_;
dvander@0
   783
    }
dvander@0
   784
    Statement *ifFalse() const {
dvander@0
   785
        return ifFalse_;
dvander@0
   786
    }
dvander@0
   787
    void setIfFalse(Statement *ifFalse) {
dvander@0
   788
        ifFalse_ = ifFalse;
dvander@0
   789
    }
dvander@0
   790
    void accept(AstVisitor *visitor) {
dvander@0
   791
        visitor->visit(this);
dvander@0
   792
    }
dvander@0
   793
};
dvander@0
   794
dvander@2
   795
class EnumStatement : public Statement
dvander@2
   796
{
dvander@54
   797
    ScopedRoot<String> name_;
dvander@2
   798
dvander@2
   799
  public:
dvander@2
   800
    struct Entry {
dvander@2
   801
        NamedConstant *name;
dvander@2
   802
        Expression *expr;
dvander@2
   803
dvander@2
   804
        Entry(NamedConstant *name, Expression *expr)
dvander@2
   805
          : name(name),
dvander@2
   806
            expr(expr)
dvander@2
   807
        {
dvander@2
   808
        }
dvander@2
   809
    };
dvander@2
   810
dvander@57
   811
    typedef PoolList<Entry> EntryList;
dvander@2
   812
dvander@2
   813
  public:
dvander@54
   814
    EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
dvander@25
   815
      : Statement(pos),
dvander@25
   816
        name_(name),
dvander@2
   817
        entries_(entries)
dvander@2
   818
    {
dvander@2
   819
    }
dvander@2
   820
dvander@2
   821
    Kind kind() const {
dvander@2
   822
        return kEnumStatement;
dvander@2
   823
    }
dvander@54
   824
    String *name() const {
dvander@2
   825
        return name_;
dvander@2
   826
    }
dvander@2
   827
    EntryList *entries() const {
dvander@2
   828
        return entries_;
dvander@2
   829
    }
dvander@2
   830
    void accept(AstVisitor *visitor) {
dvander@2
   831
        visitor->visit(this);
dvander@2
   832
    }
dvander@2
   833
dvander@2
   834
  private:
dvander@2
   835
    EntryList *entries_;
dvander@2
   836
};
dvander@2
   837
dvander@23
   838
class IncDecExpression : public Expression
dvander@23
   839
{
dvander@23
   840
    TokenKind token_;
dvander@23
   841
    Expression *expression_;
dvander@23
   842
    bool postfix_;
dvander@23
   843
dvander@23
   844
  public:
dvander@25
   845
    IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
dvander@25
   846
      : Expression(pos),
dvander@25
   847
        token_(token),
dvander@23
   848
        expression_(expression),
dvander@23
   849
        postfix_(postfix)
dvander@23
   850
    {
dvander@23
   851
    }
dvander@23
   852
dvander@23
   853
    Kind kind() const {
dvander@23
   854
        return kIncDecExpression;
dvander@23
   855
    }
dvander@23
   856
    TokenKind token() const {
dvander@23
   857
        return token_;
dvander@23
   858
    }
dvander@23
   859
    Expression *expression() const {
dvander@23
   860
        return expression_;
dvander@23
   861
    }
dvander@23
   862
    bool postfix() const {
dvander@23
   863
        return postfix_;
dvander@23
   864
    }
dvander@23
   865
    void accept(AstVisitor *visitor) {
dvander@23
   866
        visitor->visit(this);
dvander@23
   867
    }
dvander@23
   868
};
dvander@23
   869
dvander@0
   870
class Scope;
dvander@0
   871
dvander@57
   872
typedef PoolList<NameProxy *> NameProxyList;
dvander@0
   873
dvander@0
   874
class ParseTree : public PoolObject
dvander@0
   875
{
dvander@0
   876
    StatementList *statements_;
dvander@0
   877
    Scope *scope_;
dvander@0
   878
    NameProxyList *unbound_;
dvander@0
   879
dvander@0
   880
  public:
dvander@0
   881
    ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
dvander@0
   882
      : statements_(statements),
dvander@0
   883
        scope_(scope),
dvander@0
   884
        unbound_(unbound)
dvander@0
   885
    {
dvander@0
   886
    }
dvander@0
   887
dvander@0
   888
    void dump(FILE *fp);
dvander@0
   889
dvander@0
   890
    StatementList *statements() const {
dvander@0
   891
        return statements_;
dvander@0
   892
    }
dvander@0
   893
    Scope *scope() const {
dvander@0
   894
        return scope_;
dvander@0
   895
    }
dvander@0
   896
    NameProxyList *unbound() const {
dvander@0
   897
        return unbound_;
dvander@0
   898
    }
dvander@0
   899
};
dvander@0
   900
dvander@0
   901
}
dvander@0
   902
dvander@0
   903
#endif // _include_jitcraft_ast_h_