jitcraft/AST.h
author David Anderson <dvander@alliedmods.net>
Sat Jun 30 22:31:14 2012 -0700 (2012-06-30)
changeset 14 0784ac5cc347
parent 10 0c3bcd50e361
child 21 af5d8e985502
permissions -rw-r--r--
Added support for non-array references.
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 "StringPool.h"
dvander@0
    24
#include "NameBinding.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@0
    34
    _(BinaryExpression)         \
dvander@0
    35
    _(BlockStatement)           \
dvander@0
    36
    _(Assignment)               \
dvander@0
    37
    _(NameProxy)                \
dvander@0
    38
    _(ExpressionStatement)      \
dvander@0
    39
    _(FunctionStatement)        \
dvander@0
    40
    _(CallExpression)           \
dvander@0
    41
    _(IfStatement)              \
dvander@2
    42
    _(IndexExpression)          \
dvander@9
    43
    _(EnumStatement)            \
dvander@10
    44
    _(WhileStatement)           \
dvander@10
    45
    _(BreakStatement)           \
dvander@10
    46
    _(ContinueStatement)
dvander@0
    47
dvander@0
    48
// Forward declarations.
dvander@0
    49
#define _(name) class name;
dvander@0
    50
ASTKINDS(_)
dvander@0
    51
#undef _
dvander@0
    52
dvander@0
    53
class AstVisitor;
dvander@0
    54
dvander@0
    55
// Interface for AST nodes.
dvander@0
    56
class AstNode : public PoolObject
dvander@0
    57
{
dvander@0
    58
  public:
dvander@0
    59
    enum Kind {
dvander@0
    60
#       define _(name) k##name,
dvander@0
    61
        ASTKINDS(_)
dvander@0
    62
#       undef _
dvander@0
    63
        AstKind_Invalid
dvander@0
    64
    };
dvander@0
    65
    
dvander@0
    66
    virtual Kind kind() const = 0;
dvander@0
    67
dvander@0
    68
#define _(name)     bool is##name() { return kind() == k##name; }                   \
dvander@0
    69
                    name *to##name() { assert(is##name()); return (name *)this; }
dvander@0
    70
    ASTKINDS(_)
dvander@0
    71
#undef _
dvander@0
    72
dvander@0
    73
    virtual void accept(AstVisitor *visitor) = 0;
dvander@0
    74
};
dvander@0
    75
dvander@0
    76
class AstVisitor
dvander@0
    77
{
dvander@0
    78
  public:
dvander@0
    79
#define _(name) virtual void visit(name *node) = 0;
dvander@0
    80
    ASTKINDS(_)
dvander@0
    81
#undef _
dvander@0
    82
};
dvander@0
    83
dvander@0
    84
class NameLocation
dvander@0
    85
{
dvander@0
    86
  public:
dvander@0
    87
    enum Kind {
dvander@0
    88
        LOCAL
dvander@0
    89
    };
dvander@0
    90
dvander@0
    91
    static NameLocation Local(VariableDeclaration *decl) {
dvander@0
    92
        NameLocation loc;
dvander@0
    93
        loc.kind_ = LOCAL;
dvander@0
    94
        loc.u_.decl = decl;
dvander@0
    95
        return loc;
dvander@0
    96
    }
dvander@0
    97
dvander@0
    98
    Kind kind() const {
dvander@0
    99
        return kind_;
dvander@0
   100
    }
dvander@0
   101
dvander@0
   102
    VariableDeclaration *local() const {
dvander@0
   103
        assert(kind() == LOCAL);
dvander@0
   104
        return u_.decl;
dvander@0
   105
    }
dvander@0
   106
dvander@0
   107
  private:
dvander@0
   108
    Kind kind_;
dvander@0
   109
    union {
dvander@0
   110
        VariableDeclaration *decl;
dvander@0
   111
    } u_;
dvander@0
   112
};
dvander@0
   113
dvander@0
   114
class Statement : public AstNode
dvander@0
   115
{
dvander@0
   116
};
dvander@0
   117
dvander@0
   118
class Expression : public AstNode
dvander@0
   119
{
dvander@0
   120
    Type *type_;
dvander@0
   121
dvander@0
   122
  public:
dvander@0
   123
    Expression()
dvander@0
   124
      : type_(NULL)
dvander@0
   125
    {
dvander@0
   126
    }
dvander@0
   127
dvander@0
   128
    void setType(Type *type) {
dvander@0
   129
        type_ = type;
dvander@0
   130
    }
dvander@0
   131
    Type *type() const {
dvander@0
   132
        return type_;
dvander@0
   133
    }
dvander@0
   134
};
dvander@0
   135
dvander@0
   136
class Declaration : public Statement
dvander@0
   137
{
dvander@0
   138
};
dvander@0
   139
dvander@0
   140
typedef PoolList<Statement *> StatementList;
dvander@0
   141
typedef std::vector<Expression *> ExpressionList;
dvander@0
   142
dvander@0
   143
class VariableDeclaration : public Declaration
dvander@0
   144
{
dvander@0
   145
    Variable *variable_;
dvander@0
   146
    Expression *initialization_;
dvander@0
   147
    ExpressionList *postDimensions_;
dvander@4
   148
    Name *tag_;
dvander@0
   149
dvander@0
   150
  public:
dvander@4
   151
    VariableDeclaration(Variable *var, Name *tag, ExpressionList *postDimensions, Expression *initialization)
dvander@0
   152
      : variable_(var),
dvander@0
   153
        postDimensions_(postDimensions),
dvander@4
   154
        initialization_(initialization),
dvander@4
   155
        tag_(tag)
dvander@0
   156
    {
dvander@0
   157
    }
dvander@0
   158
dvander@4
   159
    Name *tag() const {
dvander@4
   160
        return tag_;
dvander@4
   161
    }
dvander@0
   162
    Kind kind() const {
dvander@0
   163
        return kVariableDeclaration;
dvander@0
   164
    }
dvander@0
   165
    Variable *variable() const {
dvander@0
   166
        return variable_;
dvander@0
   167
    }
dvander@0
   168
    Expression *initialization() const {
dvander@0
   169
        return initialization_;
dvander@0
   170
    }
dvander@0
   171
    ExpressionList *postDimensions() const {
dvander@0
   172
        return postDimensions_;
dvander@0
   173
    }
dvander@0
   174
    void accept(AstVisitor *visitor) {
dvander@0
   175
        visitor->visit(this);
dvander@0
   176
    }
dvander@0
   177
};
dvander@0
   178
dvander@14
   179
class Parameter : public PoolObject
dvander@14
   180
{
dvander@14
   181
    Variable *variable_;
dvander@14
   182
    Name *tag_;
dvander@14
   183
    bool reference_;
dvander@14
   184
dvander@14
   185
  public:
dvander@14
   186
    Parameter(Variable *var, Name *tag, bool reference)
dvander@14
   187
      : variable_(var),
dvander@14
   188
        tag_(tag),
dvander@14
   189
        reference_(reference)
dvander@14
   190
    {
dvander@14
   191
    }
dvander@14
   192
dvander@14
   193
    Name *tag() const {
dvander@14
   194
        return tag_;
dvander@14
   195
    }
dvander@14
   196
    Variable *variable() const {
dvander@14
   197
        return variable_;
dvander@14
   198
    }
dvander@14
   199
    bool reference() const {
dvander@14
   200
        return reference_;
dvander@14
   201
    }
dvander@14
   202
};
dvander@14
   203
dvander@0
   204
class NameProxy : public Expression
dvander@0
   205
{
dvander@0
   206
    Name *name_;
dvander@0
   207
    BoundName *binding_;
dvander@0
   208
dvander@0
   209
  public:
dvander@0
   210
    NameProxy(Name *name, BoundName *binding)
dvander@0
   211
      : name_(name),
dvander@0
   212
        binding_(binding)
dvander@0
   213
    {
dvander@0
   214
    }
dvander@0
   215
dvander@0
   216
    Kind kind() const {
dvander@0
   217
        return kNameProxy;
dvander@0
   218
    }
dvander@0
   219
    Name *name() const {
dvander@0
   220
        return name_;
dvander@0
   221
    }
dvander@0
   222
    void accept(AstVisitor *visitor) {
dvander@0
   223
        visitor->visit(this);
dvander@0
   224
    }
dvander@0
   225
    BoundName *binding() const {
dvander@0
   226
        return binding_;
dvander@0
   227
    }
dvander@0
   228
    void bind(BoundName *name) {
dvander@0
   229
        assert(!binding());
dvander@0
   230
        binding_ = name;
dvander@0
   231
    }
dvander@0
   232
};
dvander@0
   233
dvander@4
   234
class IntegerLiteral : public Expression
dvander@0
   235
{
dvander@0
   236
    int value_;
dvander@0
   237
dvander@0
   238
  public:
dvander@4
   239
    IntegerLiteral(int value)
dvander@0
   240
      : value_(value)
dvander@0
   241
    {
dvander@0
   242
    }
dvander@0
   243
dvander@0
   244
    Kind kind() const {
dvander@4
   245
        return kIntegerLiteral;
dvander@0
   246
    }
dvander@0
   247
    int value() const {
dvander@0
   248
        return value_;
dvander@0
   249
    }
dvander@0
   250
    void accept(AstVisitor *visitor) {
dvander@0
   251
        visitor->visit(this);
dvander@0
   252
    }
dvander@0
   253
};
dvander@0
   254
dvander@4
   255
class FloatLiteral : public Expression
dvander@4
   256
{
dvander@4
   257
    double value_;
dvander@4
   258
dvander@4
   259
  public:
dvander@4
   260
    FloatLiteral(double value)
dvander@4
   261
      : value_(value)
dvander@4
   262
    {
dvander@4
   263
    }
dvander@4
   264
dvander@4
   265
    Kind kind() const {
dvander@4
   266
        return kFloatLiteral;
dvander@4
   267
    }
dvander@4
   268
    double value() const {
dvander@4
   269
        return value_;
dvander@4
   270
    }
dvander@4
   271
    void accept(AstVisitor *visitor) {
dvander@4
   272
        visitor->visit(this);
dvander@4
   273
    }
dvander@4
   274
};
dvander@4
   275
dvander@0
   276
class BinaryExpression : public Expression
dvander@0
   277
{
dvander@0
   278
    Expression *left_;
dvander@0
   279
    Expression *right_;
dvander@0
   280
    TokenKind token_;
dvander@0
   281
dvander@0
   282
  public:
dvander@0
   283
    BinaryExpression(TokenKind token, Expression *left, Expression *right)
dvander@0
   284
      : token_(token),
dvander@0
   285
        left_(left),
dvander@0
   286
        right_(right)
dvander@0
   287
    {
dvander@0
   288
    }
dvander@0
   289
dvander@0
   290
    Kind kind() const {
dvander@0
   291
        return kBinaryExpression;
dvander@0
   292
    }
dvander@0
   293
    Expression *left() const {
dvander@0
   294
        return left_;
dvander@0
   295
    }
dvander@0
   296
    Expression *right() const {
dvander@0
   297
        return right_;
dvander@0
   298
    }
dvander@0
   299
    TokenKind token() const {
dvander@0
   300
        return token_;
dvander@0
   301
    }
dvander@0
   302
    void accept(AstVisitor *visitor) {
dvander@0
   303
        visitor->visit(this);
dvander@0
   304
    }
dvander@0
   305
};
dvander@0
   306
dvander@0
   307
class IndexExpression : public Expression
dvander@0
   308
{
dvander@0
   309
    Expression *left_;
dvander@0
   310
    Expression *right_;
dvander@0
   311
dvander@0
   312
  public:
dvander@0
   313
    IndexExpression(Expression *left, Expression *right)
dvander@0
   314
      : left_(left),
dvander@0
   315
        right_(right)
dvander@0
   316
    {
dvander@0
   317
    }
dvander@0
   318
dvander@0
   319
    Kind kind() const {
dvander@0
   320
        return kIndexExpression;
dvander@0
   321
    }
dvander@0
   322
    Expression *left() const {
dvander@0
   323
        return left_;
dvander@0
   324
    }
dvander@0
   325
    Expression *right() const {
dvander@0
   326
        return right_;
dvander@0
   327
    }
dvander@0
   328
    void accept(AstVisitor *visitor) {
dvander@0
   329
        visitor->visit(this);
dvander@0
   330
    }
dvander@0
   331
};
dvander@0
   332
dvander@0
   333
class CallExpression : public Expression
dvander@0
   334
{
dvander@0
   335
    Expression *callee_;
dvander@0
   336
    ExpressionList *arguments_;
dvander@0
   337
dvander@0
   338
  public:
dvander@0
   339
    CallExpression(Expression *callee, ExpressionList *arguments)
dvander@0
   340
      : callee_(callee),
dvander@0
   341
        arguments_(arguments)
dvander@0
   342
    {
dvander@0
   343
    }
dvander@0
   344
dvander@0
   345
    Kind kind() const {
dvander@0
   346
        return kCallExpression;
dvander@0
   347
    }
dvander@0
   348
    Expression *callee() const {
dvander@0
   349
        return callee_;
dvander@0
   350
    }
dvander@0
   351
    ExpressionList *arguments() const {
dvander@0
   352
        return arguments_;
dvander@0
   353
    }
dvander@0
   354
    void accept(AstVisitor *visitor) {
dvander@0
   355
        visitor->visit(this);
dvander@0
   356
    }
dvander@0
   357
};
dvander@0
   358
dvander@0
   359
class ForStatement : public Statement
dvander@0
   360
{
dvander@0
   361
    Scope *scope_;
dvander@0
   362
    VariableDeclaration *declaration_;
dvander@0
   363
    Expression *condition_;
dvander@0
   364
    Statement *update_;
dvander@0
   365
    Statement *body_;
dvander@0
   366
dvander@0
   367
  public:
dvander@0
   368
    ForStatement(Scope *scope, VariableDeclaration *declaration,
dvander@0
   369
                 Expression *condition, Statement *update, Statement *body)
dvander@0
   370
      : scope_(scope),
dvander@0
   371
        declaration_(declaration),
dvander@0
   372
        condition_(condition),
dvander@0
   373
        update_(update),
dvander@0
   374
        body_(body)
dvander@0
   375
    {
dvander@0
   376
    }
dvander@0
   377
dvander@0
   378
    Kind kind() const {
dvander@0
   379
        return kForStatement;
dvander@0
   380
    }
dvander@0
   381
    VariableDeclaration *declaration() const {
dvander@0
   382
        return declaration_;
dvander@0
   383
    }
dvander@0
   384
    Scope *scope() const {
dvander@0
   385
        return scope_;
dvander@0
   386
    }
dvander@0
   387
    Expression *condition() const {
dvander@0
   388
        return condition_;
dvander@0
   389
    }
dvander@0
   390
    Statement *update() const {
dvander@0
   391
        return update_;
dvander@0
   392
    }
dvander@0
   393
    Statement *body() const {
dvander@0
   394
        return body_;
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@9
   401
class WhileStatement : public Statement
dvander@9
   402
{
dvander@9
   403
    TokenKind token_;
dvander@9
   404
    Expression *condition_;
dvander@9
   405
    Statement *body_;
dvander@9
   406
dvander@9
   407
  public:
dvander@9
   408
    WhileStatement(TokenKind kind, Expression *condition, Statement *body)
dvander@9
   409
      : token_(kind),
dvander@9
   410
        condition_(condition),
dvander@9
   411
        body_(body)
dvander@9
   412
    {
dvander@9
   413
    }
dvander@9
   414
    
dvander@9
   415
    Kind kind() const {
dvander@9
   416
        return kWhileStatement;
dvander@9
   417
    }
dvander@9
   418
    TokenKind token() const {
dvander@9
   419
        return token_;
dvander@9
   420
    }
dvander@9
   421
    Expression *condition() const {
dvander@9
   422
        return condition_;
dvander@9
   423
    }
dvander@9
   424
    Statement *body() const {
dvander@9
   425
        return body_;
dvander@9
   426
    }
dvander@9
   427
    void accept(AstVisitor *visitor) {
dvander@9
   428
        visitor->visit(this);
dvander@9
   429
    }
dvander@9
   430
};
dvander@9
   431
dvander@0
   432
class ReturnStatement : public Statement
dvander@0
   433
{
dvander@0
   434
    Expression *expression_;
dvander@0
   435
dvander@0
   436
  public:
dvander@0
   437
    ReturnStatement(Expression *expression)
dvander@0
   438
      : expression_(expression)
dvander@0
   439
    {
dvander@0
   440
    }
dvander@0
   441
dvander@0
   442
    Kind kind() const {
dvander@0
   443
        return kReturnStatement;
dvander@0
   444
    }
dvander@0
   445
    Expression *expression() const {
dvander@0
   446
        return expression_;
dvander@0
   447
    }
dvander@0
   448
    void accept(AstVisitor *visitor) {
dvander@0
   449
        visitor->visit(this);
dvander@0
   450
    }
dvander@0
   451
};
dvander@0
   452
dvander@10
   453
class BreakStatement : public Statement
dvander@10
   454
{
dvander@10
   455
  public:
dvander@10
   456
    BreakStatement()
dvander@10
   457
    {
dvander@10
   458
    }
dvander@10
   459
dvander@10
   460
    Kind kind() const {
dvander@10
   461
        return kBreakStatement;
dvander@10
   462
    }
dvander@10
   463
    void accept(AstVisitor *visitor) {
dvander@10
   464
        visitor->visit(this);
dvander@10
   465
    }
dvander@10
   466
};
dvander@10
   467
dvander@10
   468
class ContinueStatement : public Statement
dvander@10
   469
{
dvander@10
   470
  public:
dvander@10
   471
    ContinueStatement()
dvander@10
   472
    {
dvander@10
   473
    }
dvander@10
   474
dvander@10
   475
    Kind kind() const {
dvander@10
   476
        return kContinueStatement;
dvander@10
   477
    }
dvander@10
   478
    void accept(AstVisitor *visitor) {
dvander@10
   479
        visitor->visit(this);
dvander@10
   480
    }
dvander@10
   481
};
dvander@10
   482
dvander@0
   483
class Assignment : public Expression
dvander@0
   484
{
dvander@0
   485
    Expression *lvalue_;
dvander@0
   486
    Expression *expression_;
dvander@0
   487
dvander@0
   488
  public:
dvander@0
   489
    Assignment(Expression *left, Expression *right)
dvander@0
   490
      : lvalue_(left),
dvander@0
   491
        expression_(right)
dvander@0
   492
    {
dvander@0
   493
    }
dvander@0
   494
dvander@0
   495
    Kind kind() const {
dvander@0
   496
        return kAssignment;
dvander@0
   497
    }
dvander@0
   498
    Expression *lvalue() const {
dvander@0
   499
        return lvalue_;
dvander@0
   500
    }
dvander@0
   501
    Expression *expression() const {
dvander@0
   502
        return expression_;
dvander@0
   503
    }
dvander@0
   504
    void accept(AstVisitor *visitor) {
dvander@0
   505
        visitor->visit(this);
dvander@0
   506
    }
dvander@0
   507
};
dvander@0
   508
dvander@0
   509
class ExpressionStatement : public Statement
dvander@0
   510
{
dvander@0
   511
    Expression *expression_;
dvander@0
   512
dvander@0
   513
  public:
dvander@0
   514
    ExpressionStatement(Expression *expression)
dvander@0
   515
      : expression_(expression)
dvander@0
   516
    {
dvander@0
   517
    }
dvander@0
   518
dvander@0
   519
    Kind kind() const {
dvander@0
   520
        return kExpressionStatement;
dvander@0
   521
    }
dvander@0
   522
    Expression *expression() const {
dvander@0
   523
        return expression_;
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@0
   530
class BlockStatement : public Statement
dvander@0
   531
{
dvander@0
   532
    Scope *scope_;
dvander@0
   533
    StatementList *statements_;
dvander@0
   534
dvander@0
   535
  public:
dvander@0
   536
    BlockStatement(Scope *scope, StatementList *statements)
dvander@0
   537
      : scope_(scope),
dvander@0
   538
        statements_(statements)
dvander@0
   539
    {
dvander@0
   540
    }
dvander@0
   541
dvander@0
   542
    Kind kind() const {
dvander@0
   543
        return kBlockStatement;
dvander@0
   544
    }
dvander@0
   545
    Scope *scope() const {
dvander@0
   546
        return scope_;
dvander@0
   547
    }
dvander@0
   548
    StatementList *statements() const {
dvander@0
   549
        return statements_;
dvander@0
   550
    }
dvander@0
   551
    void accept(AstVisitor *visitor) {
dvander@0
   552
        visitor->visit(this);
dvander@0
   553
    }
dvander@0
   554
};
dvander@0
   555
dvander@14
   556
typedef std::vector<Parameter *> ParameterList;
dvander@14
   557
dvander@0
   558
class FunctionStatement : public Statement
dvander@0
   559
{
dvander@0
   560
    Scope *scope_;
dvander@0
   561
    NamedFunction *fun_;
dvander@0
   562
    Statement *body_;
dvander@14
   563
    ParameterList *parameters_;
dvander@0
   564
dvander@0
   565
  public:
dvander@14
   566
    FunctionStatement(Scope *scope, NamedFunction *fun, Statement *body, ParameterList *parameters)
dvander@0
   567
      : scope_(scope),
dvander@0
   568
        fun_(fun),
dvander@14
   569
        body_(body),
dvander@14
   570
        parameters_(parameters)
dvander@0
   571
    {
dvander@0
   572
    }
dvander@0
   573
dvander@0
   574
    Kind kind() const {
dvander@0
   575
        return kFunctionStatement;
dvander@0
   576
    }
dvander@0
   577
    Scope *scope() const {
dvander@0
   578
        return scope_;
dvander@0
   579
    }
dvander@0
   580
    NamedFunction *fun() const {
dvander@0
   581
        return fun_;
dvander@0
   582
    }
dvander@0
   583
    Statement *body() const {
dvander@0
   584
        return body_;
dvander@0
   585
    }
dvander@14
   586
    ParameterList *parameters() const {
dvander@14
   587
        return parameters_;
dvander@14
   588
    }
dvander@0
   589
    void accept(AstVisitor *visitor) {
dvander@0
   590
        visitor->visit(this);
dvander@0
   591
    }
dvander@0
   592
};
dvander@0
   593
dvander@0
   594
class IfStatement : public Statement
dvander@0
   595
{
dvander@0
   596
    Expression *condition_;
dvander@0
   597
    Statement *ifTrue_;
dvander@0
   598
    Statement *ifFalse_;
dvander@0
   599
dvander@0
   600
  public:
dvander@0
   601
    IfStatement(Expression *condition, Statement *ifTrue)
dvander@0
   602
      : condition_(condition),
dvander@0
   603
        ifTrue_(ifTrue),
dvander@0
   604
        ifFalse_(NULL)
dvander@0
   605
    {
dvander@0
   606
    }
dvander@0
   607
dvander@0
   608
    Kind kind() const {
dvander@0
   609
        return kIfStatement;
dvander@0
   610
    }
dvander@0
   611
    Expression *condition() const {
dvander@0
   612
        return condition_;
dvander@0
   613
    }
dvander@0
   614
    Statement *ifTrue() const {
dvander@0
   615
        return ifTrue_;
dvander@0
   616
    }
dvander@0
   617
    Statement *ifFalse() const {
dvander@0
   618
        return ifFalse_;
dvander@0
   619
    }
dvander@0
   620
    void setIfFalse(Statement *ifFalse) {
dvander@0
   621
        ifFalse_ = ifFalse;
dvander@0
   622
    }
dvander@0
   623
    void accept(AstVisitor *visitor) {
dvander@0
   624
        visitor->visit(this);
dvander@0
   625
    }
dvander@0
   626
};
dvander@0
   627
dvander@2
   628
class EnumStatement : public Statement
dvander@2
   629
{
dvander@2
   630
    Name *name_;
dvander@2
   631
dvander@2
   632
  public:
dvander@2
   633
    struct Entry {
dvander@2
   634
        NamedConstant *name;
dvander@2
   635
        Expression *expr;
dvander@2
   636
dvander@2
   637
        Entry(NamedConstant *name, Expression *expr)
dvander@2
   638
          : name(name),
dvander@2
   639
            expr(expr)
dvander@2
   640
        {
dvander@2
   641
        }
dvander@2
   642
    };
dvander@2
   643
dvander@2
   644
    typedef std::vector<Entry> EntryList;
dvander@2
   645
dvander@2
   646
  public:
dvander@2
   647
    EnumStatement(Name *name, EntryList *entries)
dvander@2
   648
      : name_(name),
dvander@2
   649
        entries_(entries)
dvander@2
   650
    {
dvander@2
   651
    }
dvander@2
   652
dvander@2
   653
    Kind kind() const {
dvander@2
   654
        return kEnumStatement;
dvander@2
   655
    }
dvander@2
   656
    Name *name() const {
dvander@2
   657
        return name_;
dvander@2
   658
    }
dvander@2
   659
    EntryList *entries() const {
dvander@2
   660
        return entries_;
dvander@2
   661
    }
dvander@2
   662
    void accept(AstVisitor *visitor) {
dvander@2
   663
        visitor->visit(this);
dvander@2
   664
    }
dvander@2
   665
dvander@2
   666
  private:
dvander@2
   667
    EntryList *entries_;
dvander@2
   668
};
dvander@2
   669
dvander@0
   670
class Scope;
dvander@0
   671
dvander@0
   672
typedef std::vector<NameProxy *> NameProxyList;
dvander@0
   673
dvander@0
   674
class ParseTree : public PoolObject
dvander@0
   675
{
dvander@0
   676
    StatementList *statements_;
dvander@0
   677
    Scope *scope_;
dvander@0
   678
    NameProxyList *unbound_;
dvander@0
   679
dvander@0
   680
  public:
dvander@0
   681
    ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
dvander@0
   682
      : statements_(statements),
dvander@0
   683
        scope_(scope),
dvander@0
   684
        unbound_(unbound)
dvander@0
   685
    {
dvander@0
   686
    }
dvander@0
   687
dvander@0
   688
    void dump(FILE *fp);
dvander@0
   689
dvander@0
   690
    StatementList *statements() const {
dvander@0
   691
        return statements_;
dvander@0
   692
    }
dvander@0
   693
    Scope *scope() const {
dvander@0
   694
        return scope_;
dvander@0
   695
    }
dvander@0
   696
    NameProxyList *unbound() const {
dvander@0
   697
        return unbound_;
dvander@0
   698
    }
dvander@0
   699
};
dvander@0
   700
dvander@0
   701
}
dvander@0
   702
dvander@0
   703
#endif // _include_jitcraft_ast_h_