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