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