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