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