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