jitcraft/AST.h
author David Anderson <dvander@alliedmods.net>
Sat Jul 14 18:43:34 2012 -0700 (2012-07-14)
changeset 71 f7e573226c2b
parent 67 b765a6383849
child 78 93e0a19c805a
permissions -rw-r--r--
Added definite return analysis and void-return deduction.
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@59
    26
namespace ke {
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@67
   201
    bool const_;
dvander@66
   202
    ExpressionList *dimensions_;
dvander@14
   203
dvander@14
   204
  public:
dvander@67
   205
    Parameter(Variable *var, Handle<String> tag, bool reference, bool isConst, ExpressionList *dimensions)
dvander@14
   206
      : variable_(var),
dvander@14
   207
        tag_(tag),
dvander@66
   208
        reference_(reference),
dvander@67
   209
        const_(isConst),
dvander@66
   210
        dimensions_(dimensions)
dvander@14
   211
    {
dvander@14
   212
    }
dvander@14
   213
dvander@54
   214
    String *tag() const {
dvander@14
   215
        return tag_;
dvander@14
   216
    }
dvander@14
   217
    Variable *variable() const {
dvander@14
   218
        return variable_;
dvander@14
   219
    }
dvander@14
   220
    bool reference() const {
dvander@14
   221
        return reference_;
dvander@14
   222
    }
dvander@66
   223
    ExpressionList *dimensions() const {
dvander@66
   224
        return dimensions_;
dvander@66
   225
    }
dvander@67
   226
    bool isConst() const {
dvander@67
   227
        return const_;
dvander@67
   228
    }
dvander@14
   229
};
dvander@14
   230
dvander@0
   231
class NameProxy : public Expression
dvander@0
   232
{
dvander@54
   233
    ScopedRoot<String> name_;
dvander@0
   234
    BoundName *binding_;
dvander@0
   235
dvander@0
   236
  public:
dvander@54
   237
    NameProxy(const SourcePosition &pos, Handle<String> name, BoundName *binding)
dvander@25
   238
      : Expression(pos),
dvander@25
   239
        name_(name),
dvander@0
   240
        binding_(binding)
dvander@0
   241
    {
dvander@0
   242
    }
dvander@0
   243
dvander@0
   244
    Kind kind() const {
dvander@0
   245
        return kNameProxy;
dvander@0
   246
    }
dvander@54
   247
    String *name() const {
dvander@0
   248
        return name_;
dvander@0
   249
    }
dvander@0
   250
    void accept(AstVisitor *visitor) {
dvander@0
   251
        visitor->visit(this);
dvander@0
   252
    }
dvander@0
   253
    BoundName *binding() const {
dvander@0
   254
        return binding_;
dvander@0
   255
    }
dvander@0
   256
    void bind(BoundName *name) {
dvander@0
   257
        assert(!binding());
dvander@0
   258
        binding_ = name;
dvander@0
   259
    }
dvander@0
   260
};
dvander@0
   261
dvander@4
   262
class IntegerLiteral : public Expression
dvander@0
   263
{
dvander@0
   264
    int value_;
dvander@0
   265
dvander@0
   266
  public:
dvander@25
   267
    IntegerLiteral(const SourcePosition &pos, int value)
dvander@25
   268
      : Expression(pos),
dvander@25
   269
        value_(value)
dvander@0
   270
    {
dvander@0
   271
    }
dvander@0
   272
dvander@0
   273
    Kind kind() const {
dvander@4
   274
        return kIntegerLiteral;
dvander@0
   275
    }
dvander@0
   276
    int value() const {
dvander@0
   277
        return value_;
dvander@0
   278
    }
dvander@0
   279
    void accept(AstVisitor *visitor) {
dvander@0
   280
        visitor->visit(this);
dvander@0
   281
    }
dvander@0
   282
};
dvander@0
   283
dvander@4
   284
class FloatLiteral : public Expression
dvander@4
   285
{
dvander@4
   286
    double value_;
dvander@4
   287
dvander@4
   288
  public:
dvander@25
   289
    FloatLiteral(const SourcePosition &pos, double value)
dvander@25
   290
      : Expression(pos),
dvander@25
   291
        value_(value)
dvander@4
   292
    {
dvander@4
   293
    }
dvander@4
   294
dvander@4
   295
    Kind kind() const {
dvander@4
   296
        return kFloatLiteral;
dvander@4
   297
    }
dvander@4
   298
    double value() const {
dvander@4
   299
        return value_;
dvander@4
   300
    }
dvander@4
   301
    void accept(AstVisitor *visitor) {
dvander@4
   302
        visitor->visit(this);
dvander@4
   303
    }
dvander@4
   304
};
dvander@4
   305
dvander@21
   306
class StringLiteral : public Expression
dvander@21
   307
{
dvander@29
   308
    ScopedRoot<ByteArray> string_;
dvander@21
   309
dvander@21
   310
  public:
dvander@25
   311
    StringLiteral(const SourcePosition &pos, ByteArray *array)
dvander@25
   312
      : Expression(pos),
dvander@25
   313
        string_(array)
dvander@21
   314
    {
dvander@21
   315
    }
dvander@21
   316
dvander@21
   317
    Kind kind() const {
dvander@21
   318
        return kStringLiteral;
dvander@21
   319
    }
dvander@21
   320
    ByteArray *string() const {
dvander@21
   321
        return string_;
dvander@21
   322
    }
dvander@21
   323
    void accept(AstVisitor *visitor) {
dvander@21
   324
        visitor->visit(this);
dvander@21
   325
    }
dvander@21
   326
};
dvander@21
   327
dvander@0
   328
class BinaryExpression : public Expression
dvander@0
   329
{
dvander@0
   330
    Expression *left_;
dvander@0
   331
    Expression *right_;
dvander@0
   332
    TokenKind token_;
dvander@0
   333
dvander@0
   334
  public:
dvander@25
   335
    BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   336
      : Expression(pos),
dvander@0
   337
        left_(left),
dvander@28
   338
        right_(right),
dvander@28
   339
        token_(token)
dvander@0
   340
    {
dvander@0
   341
    }
dvander@0
   342
dvander@0
   343
    Kind kind() const {
dvander@0
   344
        return kBinaryExpression;
dvander@0
   345
    }
dvander@0
   346
    Expression *left() const {
dvander@0
   347
        return left_;
dvander@0
   348
    }
dvander@0
   349
    Expression *right() const {
dvander@0
   350
        return right_;
dvander@0
   351
    }
dvander@0
   352
    TokenKind token() const {
dvander@0
   353
        return token_;
dvander@0
   354
    }
dvander@0
   355
    void accept(AstVisitor *visitor) {
dvander@0
   356
        visitor->visit(this);
dvander@0
   357
    }
dvander@0
   358
};
dvander@0
   359
dvander@0
   360
class IndexExpression : public Expression
dvander@0
   361
{
dvander@0
   362
    Expression *left_;
dvander@0
   363
    Expression *right_;
dvander@0
   364
dvander@0
   365
  public:
dvander@25
   366
    IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
dvander@25
   367
      : Expression(pos),
dvander@25
   368
        left_(left),
dvander@0
   369
        right_(right)
dvander@0
   370
    {
dvander@0
   371
    }
dvander@0
   372
dvander@0
   373
    Kind kind() const {
dvander@0
   374
        return kIndexExpression;
dvander@0
   375
    }
dvander@0
   376
    Expression *left() const {
dvander@0
   377
        return left_;
dvander@0
   378
    }
dvander@0
   379
    Expression *right() const {
dvander@0
   380
        return right_;
dvander@0
   381
    }
dvander@0
   382
    void accept(AstVisitor *visitor) {
dvander@0
   383
        visitor->visit(this);
dvander@0
   384
    }
dvander@0
   385
};
dvander@0
   386
dvander@0
   387
class CallExpression : public Expression
dvander@0
   388
{
dvander@0
   389
    Expression *callee_;
dvander@0
   390
    ExpressionList *arguments_;
dvander@0
   391
dvander@0
   392
  public:
dvander@25
   393
    CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
dvander@25
   394
      : Expression(pos),
dvander@25
   395
        callee_(callee),
dvander@0
   396
        arguments_(arguments)
dvander@0
   397
    {
dvander@0
   398
    }
dvander@0
   399
dvander@0
   400
    Kind kind() const {
dvander@0
   401
        return kCallExpression;
dvander@0
   402
    }
dvander@0
   403
    Expression *callee() const {
dvander@0
   404
        return callee_;
dvander@0
   405
    }
dvander@0
   406
    ExpressionList *arguments() const {
dvander@0
   407
        return arguments_;
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@0
   414
class ForStatement : public Statement
dvander@0
   415
{
dvander@0
   416
    Scope *scope_;
dvander@22
   417
    Statement *initialization_;
dvander@0
   418
    Expression *condition_;
dvander@0
   419
    Statement *update_;
dvander@0
   420
    Statement *body_;
dvander@0
   421
dvander@0
   422
  public:
dvander@25
   423
    ForStatement(const SourcePosition &pos, Scope *scope, Statement *initialization,
dvander@0
   424
                 Expression *condition, Statement *update, Statement *body)
dvander@25
   425
      : Statement(pos),
dvander@25
   426
        scope_(scope),
dvander@22
   427
        initialization_(initialization),
dvander@0
   428
        condition_(condition),
dvander@0
   429
        update_(update),
dvander@0
   430
        body_(body)
dvander@0
   431
    {
dvander@0
   432
    }
dvander@0
   433
dvander@0
   434
    Kind kind() const {
dvander@0
   435
        return kForStatement;
dvander@0
   436
    }
dvander@22
   437
    Statement *initialization() const {
dvander@22
   438
        return initialization_;
dvander@0
   439
    }
dvander@0
   440
    Scope *scope() const {
dvander@0
   441
        return scope_;
dvander@0
   442
    }
dvander@0
   443
    Expression *condition() const {
dvander@0
   444
        return condition_;
dvander@0
   445
    }
dvander@0
   446
    Statement *update() const {
dvander@0
   447
        return update_;
dvander@0
   448
    }
dvander@0
   449
    Statement *body() const {
dvander@0
   450
        return body_;
dvander@0
   451
    }
dvander@0
   452
    void accept(AstVisitor *visitor) {
dvander@0
   453
        visitor->visit(this);
dvander@0
   454
    }
dvander@0
   455
};
dvander@0
   456
dvander@9
   457
class WhileStatement : public Statement
dvander@9
   458
{
dvander@9
   459
    TokenKind token_;
dvander@9
   460
    Expression *condition_;
dvander@9
   461
    Statement *body_;
dvander@9
   462
dvander@9
   463
  public:
dvander@25
   464
    WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
dvander@25
   465
      : Statement(pos),
dvander@25
   466
        token_(kind),
dvander@9
   467
        condition_(condition),
dvander@9
   468
        body_(body)
dvander@9
   469
    {
dvander@9
   470
    }
dvander@9
   471
    
dvander@9
   472
    Kind kind() const {
dvander@9
   473
        return kWhileStatement;
dvander@9
   474
    }
dvander@9
   475
    TokenKind token() const {
dvander@9
   476
        return token_;
dvander@9
   477
    }
dvander@9
   478
    Expression *condition() const {
dvander@9
   479
        return condition_;
dvander@9
   480
    }
dvander@9
   481
    Statement *body() const {
dvander@9
   482
        return body_;
dvander@9
   483
    }
dvander@9
   484
    void accept(AstVisitor *visitor) {
dvander@9
   485
        visitor->visit(this);
dvander@9
   486
    }
dvander@9
   487
};
dvander@9
   488
dvander@0
   489
class ReturnStatement : public Statement
dvander@0
   490
{
dvander@0
   491
    Expression *expression_;
dvander@0
   492
dvander@0
   493
  public:
dvander@25
   494
    ReturnStatement(const SourcePosition &pos, Expression *expression)
dvander@25
   495
      : Statement(pos),
dvander@25
   496
        expression_(expression)
dvander@0
   497
    {
dvander@0
   498
    }
dvander@0
   499
dvander@0
   500
    Kind kind() const {
dvander@0
   501
        return kReturnStatement;
dvander@0
   502
    }
dvander@0
   503
    Expression *expression() const {
dvander@0
   504
        return expression_;
dvander@0
   505
    }
dvander@0
   506
    void accept(AstVisitor *visitor) {
dvander@0
   507
        visitor->visit(this);
dvander@0
   508
    }
dvander@0
   509
};
dvander@0
   510
dvander@10
   511
class BreakStatement : public Statement
dvander@10
   512
{
dvander@10
   513
  public:
dvander@25
   514
    BreakStatement(const SourcePosition &pos)
dvander@25
   515
      : Statement(pos)
dvander@10
   516
    {
dvander@10
   517
    }
dvander@10
   518
dvander@10
   519
    Kind kind() const {
dvander@10
   520
        return kBreakStatement;
dvander@10
   521
    }
dvander@10
   522
    void accept(AstVisitor *visitor) {
dvander@10
   523
        visitor->visit(this);
dvander@10
   524
    }
dvander@10
   525
};
dvander@10
   526
dvander@10
   527
class ContinueStatement : public Statement
dvander@10
   528
{
dvander@10
   529
  public:
dvander@25
   530
    ContinueStatement(const SourcePosition &pos)
dvander@25
   531
      : Statement(pos)
dvander@10
   532
    {
dvander@10
   533
    }
dvander@10
   534
dvander@10
   535
    Kind kind() const {
dvander@10
   536
        return kContinueStatement;
dvander@10
   537
    }
dvander@10
   538
    void accept(AstVisitor *visitor) {
dvander@10
   539
        visitor->visit(this);
dvander@10
   540
    }
dvander@10
   541
};
dvander@10
   542
dvander@0
   543
class Assignment : public Expression
dvander@0
   544
{
dvander@22
   545
    TokenKind token_;
dvander@0
   546
    Expression *lvalue_;
dvander@0
   547
    Expression *expression_;
dvander@0
   548
dvander@0
   549
  public:
dvander@25
   550
    Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   551
      : Expression(pos),
dvander@25
   552
        token_(token),
dvander@22
   553
        lvalue_(left),
dvander@0
   554
        expression_(right)
dvander@0
   555
    {
dvander@0
   556
    }
dvander@0
   557
dvander@0
   558
    Kind kind() const {
dvander@0
   559
        return kAssignment;
dvander@0
   560
    }
dvander@22
   561
    TokenKind token() const {
dvander@22
   562
        return token_;
dvander@22
   563
    }
dvander@0
   564
    Expression *lvalue() const {
dvander@0
   565
        return lvalue_;
dvander@0
   566
    }
dvander@0
   567
    Expression *expression() const {
dvander@0
   568
        return expression_;
dvander@0
   569
    }
dvander@0
   570
    void accept(AstVisitor *visitor) {
dvander@0
   571
        visitor->visit(this);
dvander@0
   572
    }
dvander@0
   573
};
dvander@0
   574
dvander@0
   575
class ExpressionStatement : public Statement
dvander@0
   576
{
dvander@0
   577
    Expression *expression_;
dvander@0
   578
dvander@0
   579
  public:
dvander@0
   580
    ExpressionStatement(Expression *expression)
dvander@25
   581
      : Statement(expression->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 kExpressionStatement;
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@0
   597
class BlockStatement : public Statement
dvander@0
   598
{
dvander@0
   599
    Scope *scope_;
dvander@0
   600
    StatementList *statements_;
dvander@0
   601
dvander@0
   602
  public:
dvander@25
   603
    BlockStatement(const SourcePosition &pos, Scope *scope, StatementList *statements)
dvander@25
   604
      : Statement(pos),
dvander@25
   605
        scope_(scope),
dvander@0
   606
        statements_(statements)
dvander@0
   607
    {
dvander@0
   608
    }
dvander@0
   609
dvander@0
   610
    Kind kind() const {
dvander@0
   611
        return kBlockStatement;
dvander@0
   612
    }
dvander@0
   613
    Scope *scope() const {
dvander@0
   614
        return scope_;
dvander@0
   615
    }
dvander@0
   616
    StatementList *statements() const {
dvander@0
   617
        return statements_;
dvander@0
   618
    }
dvander@0
   619
    void accept(AstVisitor *visitor) {
dvander@0
   620
        visitor->visit(this);
dvander@0
   621
    }
dvander@0
   622
};
dvander@0
   623
dvander@57
   624
typedef PoolList<Parameter *> ParameterList;
dvander@14
   625
dvander@0
   626
class FunctionStatement : public Statement
dvander@0
   627
{
dvander@0
   628
    Scope *scope_;
dvander@0
   629
    NamedFunction *fun_;
dvander@0
   630
    Statement *body_;
dvander@14
   631
    ParameterList *parameters_;
dvander@71
   632
    bool explicitReturn_;
dvander@0
   633
dvander@0
   634
  public:
dvander@25
   635
    FunctionStatement(const SourcePosition &pos, Scope *scope, NamedFunction *fun, Statement *body,
dvander@71
   636
                      ParameterList *parameters, bool explicitReturn)
dvander@25
   637
      : Statement(pos),
dvander@25
   638
        scope_(scope),
dvander@0
   639
        fun_(fun),
dvander@14
   640
        body_(body),
dvander@71
   641
        parameters_(parameters),
dvander@71
   642
        explicitReturn_(explicitReturn)
dvander@0
   643
    {
dvander@0
   644
    }
dvander@0
   645
dvander@0
   646
    Kind kind() const {
dvander@0
   647
        return kFunctionStatement;
dvander@0
   648
    }
dvander@0
   649
    Scope *scope() const {
dvander@0
   650
        return scope_;
dvander@0
   651
    }
dvander@0
   652
    NamedFunction *fun() const {
dvander@0
   653
        return fun_;
dvander@0
   654
    }
dvander@0
   655
    Statement *body() const {
dvander@0
   656
        return body_;
dvander@0
   657
    }
dvander@14
   658
    ParameterList *parameters() const {
dvander@14
   659
        return parameters_;
dvander@14
   660
    }
dvander@0
   661
    void accept(AstVisitor *visitor) {
dvander@0
   662
        visitor->visit(this);
dvander@0
   663
    }
dvander@71
   664
    bool hasExplicitReturn() const {
dvander@71
   665
        return explicitReturn_;
dvander@71
   666
    }
dvander@0
   667
};
dvander@0
   668
dvander@0
   669
class IfStatement : public Statement
dvander@0
   670
{
dvander@0
   671
    Expression *condition_;
dvander@0
   672
    Statement *ifTrue_;
dvander@0
   673
    Statement *ifFalse_;
dvander@0
   674
dvander@0
   675
  public:
dvander@25
   676
    IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
dvander@25
   677
      : Statement(pos),
dvander@25
   678
        condition_(condition),
dvander@0
   679
        ifTrue_(ifTrue),
dvander@0
   680
        ifFalse_(NULL)
dvander@0
   681
    {
dvander@0
   682
    }
dvander@0
   683
dvander@0
   684
    Kind kind() const {
dvander@0
   685
        return kIfStatement;
dvander@0
   686
    }
dvander@0
   687
    Expression *condition() const {
dvander@0
   688
        return condition_;
dvander@0
   689
    }
dvander@0
   690
    Statement *ifTrue() const {
dvander@0
   691
        return ifTrue_;
dvander@0
   692
    }
dvander@0
   693
    Statement *ifFalse() const {
dvander@0
   694
        return ifFalse_;
dvander@0
   695
    }
dvander@0
   696
    void setIfFalse(Statement *ifFalse) {
dvander@0
   697
        ifFalse_ = ifFalse;
dvander@0
   698
    }
dvander@0
   699
    void accept(AstVisitor *visitor) {
dvander@0
   700
        visitor->visit(this);
dvander@0
   701
    }
dvander@0
   702
};
dvander@0
   703
dvander@2
   704
class EnumStatement : public Statement
dvander@2
   705
{
dvander@54
   706
    ScopedRoot<String> name_;
dvander@2
   707
dvander@2
   708
  public:
dvander@2
   709
    struct Entry {
dvander@2
   710
        NamedConstant *name;
dvander@2
   711
        Expression *expr;
dvander@2
   712
dvander@2
   713
        Entry(NamedConstant *name, Expression *expr)
dvander@2
   714
          : name(name),
dvander@2
   715
            expr(expr)
dvander@2
   716
        {
dvander@2
   717
        }
dvander@2
   718
    };
dvander@2
   719
dvander@57
   720
    typedef PoolList<Entry> EntryList;
dvander@2
   721
dvander@2
   722
  public:
dvander@54
   723
    EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
dvander@25
   724
      : Statement(pos),
dvander@25
   725
        name_(name),
dvander@2
   726
        entries_(entries)
dvander@2
   727
    {
dvander@2
   728
    }
dvander@2
   729
dvander@2
   730
    Kind kind() const {
dvander@2
   731
        return kEnumStatement;
dvander@2
   732
    }
dvander@54
   733
    String *name() const {
dvander@2
   734
        return name_;
dvander@2
   735
    }
dvander@2
   736
    EntryList *entries() const {
dvander@2
   737
        return entries_;
dvander@2
   738
    }
dvander@2
   739
    void accept(AstVisitor *visitor) {
dvander@2
   740
        visitor->visit(this);
dvander@2
   741
    }
dvander@2
   742
dvander@2
   743
  private:
dvander@2
   744
    EntryList *entries_;
dvander@2
   745
};
dvander@2
   746
dvander@23
   747
class IncDecExpression : public Expression
dvander@23
   748
{
dvander@23
   749
    TokenKind token_;
dvander@23
   750
    Expression *expression_;
dvander@23
   751
    bool postfix_;
dvander@23
   752
dvander@23
   753
  public:
dvander@25
   754
    IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
dvander@25
   755
      : Expression(pos),
dvander@25
   756
        token_(token),
dvander@23
   757
        expression_(expression),
dvander@23
   758
        postfix_(postfix)
dvander@23
   759
    {
dvander@23
   760
    }
dvander@23
   761
dvander@23
   762
    Kind kind() const {
dvander@23
   763
        return kIncDecExpression;
dvander@23
   764
    }
dvander@23
   765
    TokenKind token() const {
dvander@23
   766
        return token_;
dvander@23
   767
    }
dvander@23
   768
    Expression *expression() const {
dvander@23
   769
        return expression_;
dvander@23
   770
    }
dvander@23
   771
    bool postfix() const {
dvander@23
   772
        return postfix_;
dvander@23
   773
    }
dvander@23
   774
    void accept(AstVisitor *visitor) {
dvander@23
   775
        visitor->visit(this);
dvander@23
   776
    }
dvander@23
   777
};
dvander@23
   778
dvander@0
   779
class Scope;
dvander@0
   780
dvander@57
   781
typedef PoolList<NameProxy *> NameProxyList;
dvander@0
   782
dvander@0
   783
class ParseTree : public PoolObject
dvander@0
   784
{
dvander@0
   785
    StatementList *statements_;
dvander@0
   786
    Scope *scope_;
dvander@0
   787
    NameProxyList *unbound_;
dvander@0
   788
dvander@0
   789
  public:
dvander@0
   790
    ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
dvander@0
   791
      : statements_(statements),
dvander@0
   792
        scope_(scope),
dvander@0
   793
        unbound_(unbound)
dvander@0
   794
    {
dvander@0
   795
    }
dvander@0
   796
dvander@0
   797
    void dump(FILE *fp);
dvander@0
   798
dvander@0
   799
    StatementList *statements() const {
dvander@0
   800
        return statements_;
dvander@0
   801
    }
dvander@0
   802
    Scope *scope() const {
dvander@0
   803
        return scope_;
dvander@0
   804
    }
dvander@0
   805
    NameProxyList *unbound() const {
dvander@0
   806
        return unbound_;
dvander@0
   807
    }
dvander@0
   808
};
dvander@0
   809
dvander@0
   810
}
dvander@0
   811
dvander@0
   812
#endif // _include_jitcraft_ast_h_