src/compiler/AST.h
author David Anderson <dvander@alliedmods.net>
Tue Jan 01 16:28:34 2013 -0800 (2013-01-01)
changeset 252 1dee2330aa78
parent 251 ca99a81745fe
child 256 3c184218462d
permissions -rw-r--r--
Fix linux/mac support.
dvander@132
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@132
     2
 *
dvander@0
     3
 * Copyright (C) 2012 David Anderson
dvander@0
     4
 *
dvander@132
     5
 * This file is part of SourcePawn.
dvander@0
     6
 *
dvander@132
     7
 * SourcePawn is free software: you can redistribute it and/or modify it under
dvander@0
     8
 * the terms of the GNU General Public License as published by the Free
dvander@0
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
    10
 * any later version.
dvander@0
    11
 * 
dvander@132
    12
 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    15
 *
dvander@0
    16
 * You should have received a copy of the GNU General Public License along with
dvander@132
    17
 * SourcePawn. If not, see http://www.gnu.org/licenses/.
dvander@0
    18
 */
dvander@168
    19
#ifndef _include_sourcepawn_ast_h_
dvander@168
    20
#define _include_sourcepawn_ast_h_
dvander@0
    21
dvander@195
    22
#include "../PoolAllocator.h"
dvander@195
    23
#include "../Vector.h"
dvander@0
    24
#include "Token.h"
dvander@0
    25
#include "NameBinding.h"
dvander@195
    26
#include "Symbols.h"
dvander@0
    27
dvander@59
    28
namespace ke {
dvander@0
    29
dvander@195
    30
class Scope;
dvander@251
    31
struct PathComponent;
dvander@195
    32
dvander@0
    33
#define ASTKINDS(_)             \
dvander@0
    34
    _(VariableDeclaration)      \
dvander@0
    35
    _(ForStatement)             \
dvander@0
    36
    _(ReturnStatement)          \
dvander@4
    37
    _(IntegerLiteral)           \
dvander@4
    38
    _(FloatLiteral)             \
dvander@21
    39
    _(StringLiteral)            \
dvander@0
    40
    _(BinaryExpression)         \
dvander@0
    41
    _(BlockStatement)           \
dvander@0
    42
    _(Assignment)               \
dvander@0
    43
    _(NameProxy)                \
dvander@0
    44
    _(ExpressionStatement)      \
dvander@0
    45
    _(FunctionStatement)        \
dvander@0
    46
    _(CallExpression)           \
dvander@0
    47
    _(IfStatement)              \
dvander@2
    48
    _(IndexExpression)          \
dvander@148
    49
    _(FieldExpression)          \
dvander@9
    50
    _(EnumStatement)            \
dvander@10
    51
    _(WhileStatement)           \
dvander@10
    52
    _(BreakStatement)           \
dvander@23
    53
    _(ContinueStatement)        \
dvander@174
    54
    _(FunctionTypeStatement)    \
dvander@78
    55
    _(IncDecExpression)         \
dvander@83
    56
    _(UnaryExpression)          \
dvander@143
    57
    _(TernaryExpression)        \
dvander@146
    58
    _(BooleanLiteral)           \
dvander@172
    59
    _(StructureStatement)       \
dvander@187
    60
    _(SwitchStatement)          \
dvander@195
    61
    _(ArrayLiteral)             \
dvander@251
    62
    _(ImportStatement)
dvander@0
    63
dvander@0
    64
// Forward declarations.
dvander@0
    65
#define _(name) class name;
dvander@0
    66
ASTKINDS(_)
dvander@0
    67
#undef _
dvander@0
    68
dvander@0
    69
class AstVisitor;
dvander@0
    70
dvander@0
    71
// Interface for AST nodes.
dvander@0
    72
class AstNode : public PoolObject
dvander@0
    73
{
dvander@25
    74
    SourcePosition pos_;
dvander@25
    75
dvander@0
    76
  public:
dvander@0
    77
    enum Kind {
dvander@0
    78
#       define _(name) k##name,
dvander@0
    79
        ASTKINDS(_)
dvander@0
    80
#       undef _
dvander@0
    81
        AstKind_Invalid
dvander@0
    82
    };
dvander@25
    83
dvander@25
    84
    AstNode(const SourcePosition &pos)
dvander@25
    85
      : pos_(pos)
dvander@25
    86
    {
dvander@25
    87
    }
dvander@0
    88
    
dvander@0
    89
    virtual Kind kind() const = 0;
dvander@0
    90
dvander@0
    91
#define _(name)     bool is##name() { return kind() == k##name; }                   \
dvander@187
    92
                    name *to##name() { assert(is##name()); return (name *)this; }   \
dvander@187
    93
                    name *as##name() { if (!is##name()) return NULL; return to##name(); }
dvander@0
    94
    ASTKINDS(_)
dvander@0
    95
#undef _
dvander@0
    96
dvander@0
    97
    virtual void accept(AstVisitor *visitor) = 0;
dvander@25
    98
dvander@25
    99
    const SourcePosition &pos() const {
dvander@25
   100
        return pos_;
dvander@25
   101
    }
dvander@0
   102
};
dvander@0
   103
dvander@195
   104
#define DECLARE_NODE(type)                      \
dvander@195
   105
    Kind kind() const {                         \
dvander@195
   106
        return k##type;                         \
dvander@195
   107
    }                                           \
dvander@195
   108
    void accept(AstVisitor *visitor) {          \
dvander@195
   109
        visitor->visit##type(this);             \
dvander@195
   110
    }
dvander@195
   111
dvander@0
   112
class AstVisitor
dvander@0
   113
{
dvander@0
   114
  public:
dvander@195
   115
#define _(name) virtual void visit##name(name *node) { assert(false); }
dvander@0
   116
    ASTKINDS(_)
dvander@0
   117
#undef _
dvander@0
   118
};
dvander@0
   119
dvander@0
   120
class Statement : public AstNode
dvander@0
   121
{
dvander@25
   122
  public:
dvander@25
   123
    Statement(const SourcePosition &pos)
dvander@25
   124
      : AstNode(pos)
dvander@25
   125
    {
dvander@25
   126
    }
dvander@0
   127
};
dvander@0
   128
dvander@0
   129
class Expression : public AstNode
dvander@0
   130
{
dvander@29
   131
    ScopedRoot<Type> type_;
dvander@0
   132
dvander@0
   133
  public:
dvander@25
   134
    Expression(const SourcePosition &pos)
dvander@25
   135
      : AstNode(pos),
dvander@25
   136
        type_(NULL)
dvander@0
   137
    {
dvander@0
   138
    }
dvander@0
   139
dvander@0
   140
    void setType(Type *type) {
dvander@0
   141
        type_ = type;
dvander@0
   142
    }
dvander@0
   143
    Type *type() const {
dvander@0
   144
        return type_;
dvander@0
   145
    }
dvander@0
   146
};
dvander@0
   147
dvander@0
   148
typedef PoolList<Statement *> StatementList;
dvander@56
   149
typedef PoolList<Expression *> ExpressionList;
dvander@0
   150
dvander@25
   151
class VariableDeclaration : public Statement
dvander@0
   152
{
dvander@195
   153
    TypeQualifiers qual_;
dvander@195
   154
    ScopedRoot<String> name_;
dvander@0
   155
    Expression *initialization_;
dvander@209
   156
    ExpressionList *dims_;
dvander@195
   157
    Expression *type_;
dvander@195
   158
    VariableSymbol *sym_;
dvander@0
   159
dvander@0
   160
  public:
dvander@195
   161
    VariableDeclaration(const SourcePosition &pos, TypeQualifiers qual, Handle<String> name,
dvander@209
   162
                        Expression *type, ExpressionList *dims, Expression *initialization)
dvander@25
   163
      : Statement(pos),
dvander@195
   164
        qual_(qual),
dvander@195
   165
        name_(name),
dvander@28
   166
        initialization_(initialization),
dvander@209
   167
        dims_(dims),
dvander@145
   168
        type_(type),
dvander@195
   169
        sym_(NULL)
dvander@0
   170
    {
dvander@0
   171
    }
dvander@0
   172
dvander@195
   173
    DECLARE_NODE(VariableDeclaration);
dvander@195
   174
dvander@0
   175
    Expression *initialization() const {
dvander@0
   176
        return initialization_;
dvander@0
   177
    }
dvander@195
   178
    Handle<String> name() {
dvander@195
   179
        return name_;
dvander@195
   180
    }
dvander@195
   181
    Expression *declType() const {
dvander@195
   182
        return type_;
dvander@0
   183
    }
dvander@195
   184
    void setSymbol(VariableSymbol *sym) {
dvander@195
   185
        assert(!sym_);
dvander@195
   186
        sym_ = sym;
dvander@0
   187
    }
dvander@195
   188
    VariableSymbol *sym() const {
dvander@195
   189
        return sym_;
dvander@195
   190
    }
dvander@195
   191
    Expression *type() const {
dvander@195
   192
        return type_;
dvander@135
   193
    }
dvander@209
   194
    ExpressionList *dims() const {
dvander@209
   195
        return dims_;
dvander@209
   196
    }
dvander@241
   197
    TypeQualifiers quals() const {
dvander@241
   198
        return qual_;
dvander@241
   199
    }
dvander@0
   200
};
dvander@0
   201
dvander@14
   202
class Parameter : public PoolObject
dvander@14
   203
{
dvander@195
   204
    ScopedRoot<String> name_;
dvander@195
   205
    Expression *type_;
dvander@14
   206
    bool reference_;
dvander@133
   207
    Expression *initializer_;
dvander@195
   208
    VariableSymbol *sym_;
dvander@195
   209
    SourcePosition pos_;
dvander@220
   210
    ExpressionList *dims_;
dvander@241
   211
    TypeQualifiers quals_;
dvander@14
   212
dvander@14
   213
  public:
dvander@241
   214
    Parameter(Handle<String> name, Expression *type, bool reference, TypeQualifiers quals,
dvander@220
   215
              ExpressionList *dims, Expression *initializer, const SourcePosition &pos)
dvander@195
   216
      : name_(name),
dvander@145
   217
        type_(type),
dvander@66
   218
        reference_(reference),
dvander@195
   219
        initializer_(initializer),
dvander@195
   220
        sym_(NULL),
dvander@220
   221
        pos_(pos),
dvander@241
   222
        dims_(dims),
dvander@241
   223
        quals_(quals)
dvander@14
   224
    {
dvander@14
   225
    }
dvander@14
   226
dvander@195
   227
    Expression *type() const {
dvander@145
   228
        return type_;
dvander@14
   229
    }
dvander@195
   230
    Handle<String> name() const {
dvander@195
   231
        return name_;
dvander@14
   232
    }
dvander@14
   233
    bool reference() const {
dvander@14
   234
        return reference_;
dvander@14
   235
    }
dvander@241
   236
    TypeQualifiers quals() const {
dvander@241
   237
        return quals_;
dvander@67
   238
    }
dvander@220
   239
    ExpressionList *dims() const {
dvander@220
   240
        return dims_;
dvander@220
   241
    }
dvander@133
   242
    Expression *initializer() const {
dvander@133
   243
        return initializer_;
dvander@133
   244
    }
dvander@195
   245
    void setSymbol(VariableSymbol *sym) {
dvander@195
   246
        assert(!sym_);
dvander@195
   247
        sym_ = sym;
dvander@195
   248
    }
dvander@195
   249
    VariableSymbol *sym() const {
dvander@195
   250
        return sym_;
dvander@195
   251
    }
dvander@195
   252
    const SourcePosition &pos() const {
dvander@195
   253
        return pos_;
dvander@195
   254
    }
dvander@14
   255
};
dvander@14
   256
dvander@0
   257
class NameProxy : public Expression
dvander@0
   258
{
dvander@54
   259
    ScopedRoot<String> name_;
dvander@195
   260
    Symbol *binding_;
dvander@0
   261
dvander@0
   262
  public:
dvander@195
   263
    NameProxy(const SourcePosition &pos, Handle<String> name)
dvander@25
   264
      : Expression(pos),
dvander@25
   265
        name_(name),
dvander@195
   266
        binding_(NULL)
dvander@0
   267
    {
dvander@0
   268
    }
dvander@0
   269
dvander@195
   270
    DECLARE_NODE(NameProxy);
dvander@195
   271
    
dvander@195
   272
    Handle<String> name() const {
dvander@0
   273
        return name_;
dvander@0
   274
    }
dvander@195
   275
    Symbol *sym() const {
dvander@0
   276
        return binding_;
dvander@0
   277
    }
dvander@195
   278
    void bind(Symbol *sym) {
dvander@195
   279
        binding_ = sym;
dvander@0
   280
    }
dvander@0
   281
};
dvander@0
   282
dvander@143
   283
class BooleanLiteral : public Expression
dvander@143
   284
{
dvander@143
   285
    TokenKind token_;
dvander@143
   286
dvander@143
   287
  public:
dvander@143
   288
    BooleanLiteral(const SourcePosition &pos, TokenKind token)
dvander@143
   289
      : Expression(pos),
dvander@143
   290
        token_(token)
dvander@143
   291
    {
dvander@143
   292
    }
dvander@143
   293
dvander@195
   294
    DECLARE_NODE(BooleanLiteral);
dvander@143
   295
    TokenKind token() const {
dvander@143
   296
        return token_;
dvander@143
   297
    }
dvander@143
   298
};
dvander@143
   299
dvander@4
   300
class IntegerLiteral : public Expression
dvander@0
   301
{
dvander@0
   302
    int value_;
dvander@0
   303
dvander@0
   304
  public:
dvander@25
   305
    IntegerLiteral(const SourcePosition &pos, int value)
dvander@25
   306
      : Expression(pos),
dvander@25
   307
        value_(value)
dvander@0
   308
    {
dvander@0
   309
    }
dvander@0
   310
dvander@195
   311
    DECLARE_NODE(IntegerLiteral);
dvander@195
   312
dvander@0
   313
    int value() const {
dvander@0
   314
        return value_;
dvander@0
   315
    }
dvander@0
   316
};
dvander@0
   317
dvander@4
   318
class FloatLiteral : public Expression
dvander@4
   319
{
dvander@4
   320
    double value_;
dvander@4
   321
dvander@4
   322
  public:
dvander@25
   323
    FloatLiteral(const SourcePosition &pos, double value)
dvander@25
   324
      : Expression(pos),
dvander@25
   325
        value_(value)
dvander@4
   326
    {
dvander@4
   327
    }
dvander@4
   328
dvander@195
   329
    DECLARE_NODE(FloatLiteral);
dvander@195
   330
dvander@4
   331
    double value() const {
dvander@4
   332
        return value_;
dvander@4
   333
    }
dvander@4
   334
};
dvander@4
   335
dvander@21
   336
class StringLiteral : public Expression
dvander@21
   337
{
dvander@234
   338
    ScopedRoot<String> string_;
dvander@21
   339
dvander@21
   340
  public:
dvander@234
   341
    StringLiteral(const SourcePosition &pos, String *string)
dvander@25
   342
      : Expression(pos),
dvander@234
   343
        string_(string)
dvander@21
   344
    {
dvander@21
   345
    }
dvander@21
   346
dvander@195
   347
    DECLARE_NODE(StringLiteral);
dvander@195
   348
dvander@234
   349
    String *string() const {
dvander@21
   350
        return string_;
dvander@21
   351
    }
dvander@21
   352
};
dvander@21
   353
dvander@187
   354
class ArrayLiteral : public Expression
dvander@187
   355
{
dvander@187
   356
    TokenKind token_;
dvander@187
   357
    ExpressionList *expressions_;
dvander@187
   358
dvander@187
   359
  public:
dvander@187
   360
    ArrayLiteral(const SourcePosition &pos, TokenKind token, ExpressionList *expressions)
dvander@187
   361
      : Expression(pos),
dvander@187
   362
        token_(token),
dvander@187
   363
        expressions_(expressions)
dvander@187
   364
    {
dvander@187
   365
    }
dvander@187
   366
dvander@195
   367
    DECLARE_NODE(ArrayLiteral);
dvander@195
   368
dvander@187
   369
    TokenKind token() const {
dvander@187
   370
        return token_;
dvander@187
   371
    }
dvander@187
   372
    ExpressionList *expressions() const {
dvander@187
   373
        return expressions_;
dvander@187
   374
    }
dvander@187
   375
    bool isFixed() const {
dvander@187
   376
        return token_ == TOK_LBRACE;
dvander@187
   377
    }
dvander@187
   378
};
dvander@187
   379
dvander@78
   380
class UnaryExpression : public Expression
dvander@78
   381
{
dvander@78
   382
    Expression *expression_;
dvander@78
   383
    TokenKind token_;
dvander@195
   384
    NameProxy *tag_;
dvander@78
   385
dvander@78
   386
  public:
dvander@78
   387
    UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
dvander@78
   388
      : Expression(pos),
dvander@78
   389
        expression_(expr),
dvander@195
   390
        token_(token),
dvander@195
   391
        tag_(NULL)
dvander@78
   392
    {
dvander@78
   393
    }
dvander@78
   394
dvander@142
   395
    UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
dvander@195
   396
                    NameProxy *tag)
dvander@142
   397
      : Expression(pos),
dvander@142
   398
        expression_(expr),
dvander@142
   399
        token_(token),
dvander@195
   400
        tag_(tag)
dvander@142
   401
    {
dvander@142
   402
    }
dvander@142
   403
dvander@195
   404
    DECLARE_NODE(UnaryExpression);
dvander@195
   405
dvander@78
   406
    Expression *expression() const {
dvander@78
   407
        return expression_;
dvander@78
   408
    }
dvander@78
   409
    TokenKind token() const {
dvander@78
   410
        return token_;
dvander@78
   411
    }
dvander@195
   412
    NameProxy *tag() const {
dvander@195
   413
        return tag_;
dvander@78
   414
    }
dvander@78
   415
};
dvander@78
   416
dvander@0
   417
class BinaryExpression : public Expression
dvander@0
   418
{
dvander@0
   419
    Expression *left_;
dvander@0
   420
    Expression *right_;
dvander@0
   421
    TokenKind token_;
dvander@0
   422
dvander@0
   423
  public:
dvander@25
   424
    BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   425
      : Expression(pos),
dvander@0
   426
        left_(left),
dvander@28
   427
        right_(right),
dvander@28
   428
        token_(token)
dvander@0
   429
    {
dvander@0
   430
    }
dvander@0
   431
dvander@195
   432
    DECLARE_NODE(BinaryExpression);
dvander@195
   433
dvander@0
   434
    Expression *left() const {
dvander@0
   435
        return left_;
dvander@0
   436
    }
dvander@0
   437
    Expression *right() const {
dvander@0
   438
        return right_;
dvander@0
   439
    }
dvander@0
   440
    TokenKind token() const {
dvander@0
   441
        return token_;
dvander@0
   442
    }
dvander@0
   443
};
dvander@0
   444
dvander@83
   445
class TernaryExpression : public Expression
dvander@83
   446
{
dvander@83
   447
    Expression *condition_;
dvander@83
   448
    Expression *left_;
dvander@83
   449
    Expression *right_;
dvander@83
   450
dvander@83
   451
  public:
dvander@83
   452
    TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
dvander@83
   453
      : Expression(pos),
dvander@83
   454
        condition_(condition),
dvander@83
   455
        left_(left),
dvander@83
   456
        right_(right)
dvander@83
   457
    {
dvander@83
   458
    }
dvander@83
   459
dvander@195
   460
    DECLARE_NODE(TernaryExpression);
dvander@195
   461
dvander@83
   462
    Expression *condition() const {
dvander@83
   463
        return condition_;
dvander@83
   464
    }
dvander@83
   465
    Expression *left() const {
dvander@83
   466
        return left_;
dvander@83
   467
    }
dvander@83
   468
    Expression *right() const {
dvander@83
   469
        return right_;
dvander@83
   470
    }
dvander@83
   471
};
dvander@83
   472
dvander@0
   473
class IndexExpression : public Expression
dvander@0
   474
{
dvander@0
   475
    Expression *left_;
dvander@0
   476
    Expression *right_;
dvander@0
   477
dvander@0
   478
  public:
dvander@25
   479
    IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
dvander@25
   480
      : Expression(pos),
dvander@25
   481
        left_(left),
dvander@0
   482
        right_(right)
dvander@0
   483
    {
dvander@0
   484
    }
dvander@0
   485
dvander@195
   486
    DECLARE_NODE(IndexExpression);
dvander@195
   487
dvander@0
   488
    Expression *left() const {
dvander@0
   489
        return left_;
dvander@0
   490
    }
dvander@0
   491
    Expression *right() const {
dvander@0
   492
        return right_;
dvander@0
   493
    }
dvander@0
   494
};
dvander@0
   495
dvander@148
   496
class FieldExpression : public Expression
dvander@148
   497
{
dvander@148
   498
    Expression *left_;
dvander@148
   499
    ScopedRoot<String> field_;
dvander@148
   500
    unsigned fieldIndex_;
dvander@148
   501
dvander@148
   502
  public:
dvander@148
   503
    FieldExpression(const SourcePosition &pos, Expression *left, Handle<String> field)
dvander@148
   504
      : Expression(pos),
dvander@148
   505
        left_(left),
dvander@148
   506
        field_(field),
dvander@148
   507
        fieldIndex_(unsigned(-1))
dvander@148
   508
    {
dvander@148
   509
    }
dvander@148
   510
dvander@195
   511
    DECLARE_NODE(FieldExpression);
dvander@195
   512
dvander@148
   513
    Expression *left() const {
dvander@148
   514
        return left_;
dvander@148
   515
    }
dvander@148
   516
    String *field() const {
dvander@148
   517
        return field_;
dvander@148
   518
    }
dvander@148
   519
    void setFieldIndex(unsigned index) {
dvander@148
   520
        assert(fieldIndex_ == unsigned(-1));
dvander@148
   521
        fieldIndex_ = index;
dvander@148
   522
    }
dvander@148
   523
    unsigned fieldIndex() const {
dvander@148
   524
        assert(fieldIndex_ != unsigned(-1));
dvander@148
   525
        return fieldIndex_;
dvander@148
   526
    }
dvander@148
   527
};
dvander@148
   528
dvander@0
   529
class CallExpression : public Expression
dvander@0
   530
{
dvander@0
   531
    Expression *callee_;
dvander@0
   532
    ExpressionList *arguments_;
dvander@0
   533
dvander@0
   534
  public:
dvander@25
   535
    CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
dvander@25
   536
      : Expression(pos),
dvander@25
   537
        callee_(callee),
dvander@0
   538
        arguments_(arguments)
dvander@0
   539
    {
dvander@0
   540
    }
dvander@0
   541
dvander@195
   542
    DECLARE_NODE(CallExpression);
dvander@195
   543
dvander@0
   544
    Expression *callee() const {
dvander@0
   545
        return callee_;
dvander@0
   546
    }
dvander@0
   547
    ExpressionList *arguments() const {
dvander@0
   548
        return arguments_;
dvander@0
   549
    }
dvander@0
   550
};
dvander@0
   551
dvander@0
   552
class ForStatement : public Statement
dvander@0
   553
{
dvander@22
   554
    Statement *initialization_;
dvander@0
   555
    Expression *condition_;
dvander@0
   556
    Statement *update_;
dvander@0
   557
    Statement *body_;
dvander@195
   558
    Scope *scope_;
dvander@0
   559
dvander@0
   560
  public:
dvander@195
   561
    ForStatement(const SourcePosition &pos, Statement *initialization,
dvander@0
   562
                 Expression *condition, Statement *update, Statement *body)
dvander@25
   563
      : Statement(pos),
dvander@22
   564
        initialization_(initialization),
dvander@0
   565
        condition_(condition),
dvander@0
   566
        update_(update),
dvander@195
   567
        body_(body),
dvander@195
   568
        scope_(NULL)
dvander@0
   569
    {
dvander@0
   570
    }
dvander@0
   571
dvander@195
   572
    DECLARE_NODE(ForStatement);
dvander@195
   573
dvander@22
   574
    Statement *initialization() const {
dvander@22
   575
        return initialization_;
dvander@0
   576
    }
dvander@0
   577
    Expression *condition() const {
dvander@0
   578
        return condition_;
dvander@0
   579
    }
dvander@0
   580
    Statement *update() const {
dvander@0
   581
        return update_;
dvander@0
   582
    }
dvander@0
   583
    Statement *body() const {
dvander@0
   584
        return body_;
dvander@0
   585
    }
dvander@195
   586
    Scope *scope() const {
dvander@195
   587
        return scope_;
dvander@195
   588
    }
dvander@195
   589
    void setScope(Scope *scope) {
dvander@195
   590
        scope_ = scope;
dvander@0
   591
    }
dvander@0
   592
};
dvander@0
   593
dvander@9
   594
class WhileStatement : public Statement
dvander@9
   595
{
dvander@9
   596
    TokenKind token_;
dvander@9
   597
    Expression *condition_;
dvander@9
   598
    Statement *body_;
dvander@9
   599
dvander@9
   600
  public:
dvander@25
   601
    WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
dvander@25
   602
      : Statement(pos),
dvander@25
   603
        token_(kind),
dvander@9
   604
        condition_(condition),
dvander@9
   605
        body_(body)
dvander@9
   606
    {
dvander@9
   607
    }
dvander@9
   608
    
dvander@195
   609
    DECLARE_NODE(WhileStatement);
dvander@195
   610
dvander@9
   611
    TokenKind token() const {
dvander@9
   612
        return token_;
dvander@9
   613
    }
dvander@9
   614
    Expression *condition() const {
dvander@9
   615
        return condition_;
dvander@9
   616
    }
dvander@9
   617
    Statement *body() const {
dvander@9
   618
        return body_;
dvander@9
   619
    }
dvander@9
   620
};
dvander@9
   621
dvander@0
   622
class ReturnStatement : public Statement
dvander@0
   623
{
dvander@0
   624
    Expression *expression_;
dvander@0
   625
dvander@0
   626
  public:
dvander@25
   627
    ReturnStatement(const SourcePosition &pos, Expression *expression)
dvander@25
   628
      : Statement(pos),
dvander@25
   629
        expression_(expression)
dvander@0
   630
    {
dvander@0
   631
    }
dvander@0
   632
dvander@195
   633
    DECLARE_NODE(ReturnStatement);
dvander@195
   634
dvander@0
   635
    Expression *expression() const {
dvander@0
   636
        return expression_;
dvander@0
   637
    }
dvander@0
   638
};
dvander@0
   639
dvander@10
   640
class BreakStatement : public Statement
dvander@10
   641
{
dvander@10
   642
  public:
dvander@25
   643
    BreakStatement(const SourcePosition &pos)
dvander@25
   644
      : Statement(pos)
dvander@10
   645
    {
dvander@10
   646
    }
dvander@10
   647
dvander@195
   648
    DECLARE_NODE(BreakStatement);
dvander@10
   649
};
dvander@10
   650
dvander@10
   651
class ContinueStatement : public Statement
dvander@10
   652
{
dvander@10
   653
  public:
dvander@25
   654
    ContinueStatement(const SourcePosition &pos)
dvander@25
   655
      : Statement(pos)
dvander@10
   656
    {
dvander@10
   657
    }
dvander@10
   658
dvander@195
   659
    DECLARE_NODE(ContinueStatement);
dvander@10
   660
};
dvander@10
   661
dvander@0
   662
class Assignment : public Expression
dvander@0
   663
{
dvander@22
   664
    TokenKind token_;
dvander@0
   665
    Expression *lvalue_;
dvander@0
   666
    Expression *expression_;
dvander@0
   667
dvander@0
   668
  public:
dvander@25
   669
    Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   670
      : Expression(pos),
dvander@25
   671
        token_(token),
dvander@22
   672
        lvalue_(left),
dvander@0
   673
        expression_(right)
dvander@0
   674
    {
dvander@0
   675
    }
dvander@0
   676
dvander@195
   677
    DECLARE_NODE(Assignment);
dvander@195
   678
dvander@22
   679
    TokenKind token() const {
dvander@22
   680
        return token_;
dvander@22
   681
    }
dvander@0
   682
    Expression *lvalue() const {
dvander@0
   683
        return lvalue_;
dvander@0
   684
    }
dvander@0
   685
    Expression *expression() const {
dvander@0
   686
        return expression_;
dvander@0
   687
    }
dvander@0
   688
};
dvander@0
   689
dvander@0
   690
class ExpressionStatement : public Statement
dvander@0
   691
{
dvander@0
   692
    Expression *expression_;
dvander@0
   693
dvander@0
   694
  public:
dvander@0
   695
    ExpressionStatement(Expression *expression)
dvander@25
   696
      : Statement(expression->pos()),
dvander@25
   697
        expression_(expression)
dvander@0
   698
    {
dvander@0
   699
    }
dvander@0
   700
dvander@195
   701
    DECLARE_NODE(ExpressionStatement);
dvander@195
   702
dvander@0
   703
    Expression *expression() const {
dvander@0
   704
        return expression_;
dvander@0
   705
    }
dvander@0
   706
};
dvander@0
   707
dvander@0
   708
class BlockStatement : public Statement
dvander@0
   709
{
dvander@195
   710
    StatementList *statements_;
dvander@0
   711
    Scope *scope_;
dvander@247
   712
    TokenKind type_;
dvander@0
   713
dvander@0
   714
  public:
dvander@247
   715
    BlockStatement(const SourcePosition &pos, StatementList *statements, TokenKind kind)
dvander@25
   716
      : Statement(pos),
dvander@195
   717
        statements_(statements),
dvander@247
   718
        scope_(NULL),
dvander@247
   719
        type_(kind)
dvander@0
   720
    {
dvander@0
   721
    }
dvander@0
   722
dvander@195
   723
    DECLARE_NODE(BlockStatement);
dvander@195
   724
dvander@195
   725
    StatementList *statements() const {
dvander@195
   726
        return statements_;
dvander@0
   727
    }
dvander@0
   728
    Scope *scope() const {
dvander@0
   729
        return scope_;
dvander@0
   730
    }
dvander@195
   731
    void setScope(Scope *scope) {
dvander@195
   732
        scope_ = scope;
dvander@0
   733
    }
dvander@247
   734
    TokenKind type() const {
dvander@247
   735
        return type_;
dvander@247
   736
    }
dvander@0
   737
};
dvander@0
   738
dvander@57
   739
typedef PoolList<Parameter *> ParameterList;
dvander@14
   740
dvander@174
   741
class FunctionSignature
dvander@174
   742
{
dvander@174
   743
  public:
dvander@195
   744
    FunctionSignature(Expression *returnType, ParameterList *parameters, bool variadic)
dvander@174
   745
      : returnType_(returnType),
dvander@195
   746
        parameters_(parameters),
dvander@195
   747
        variadic_(variadic)
dvander@174
   748
    {
dvander@174
   749
    }
dvander@174
   750
dvander@195
   751
    Expression *returnType() const {
dvander@174
   752
        return returnType_;
dvander@174
   753
    }
dvander@174
   754
    ParameterList *parameters() const {
dvander@174
   755
        return parameters_;
dvander@174
   756
    }
dvander@195
   757
    bool variadic() const {
dvander@195
   758
        return variadic_;
dvander@195
   759
    }
dvander@174
   760
dvander@174
   761
  private:
dvander@195
   762
    Expression *returnType_;
dvander@174
   763
    ParameterList *parameters_;
dvander@195
   764
    bool variadic_;
dvander@174
   765
};
dvander@174
   766
dvander@174
   767
class FunctionTypeStatement : public Statement
dvander@174
   768
{
dvander@174
   769
  public:
dvander@195
   770
    FunctionTypeStatement(const SourcePosition &pos, Handle<String> name, const FunctionSignature &signature)
dvander@174
   771
      : Statement(pos),
dvander@195
   772
        name_(name),
dvander@174
   773
        signature_(signature)
dvander@174
   774
    {
dvander@174
   775
    }
dvander@174
   776
dvander@195
   777
    DECLARE_NODE(FunctionTypeStatement);
dvander@195
   778
dvander@195
   779
    Handle<String> name() const {
dvander@195
   780
        return name_;
dvander@174
   781
    }
dvander@174
   782
    const FunctionSignature &signature() const {
dvander@174
   783
        return signature_;
dvander@174
   784
    }
dvander@174
   785
dvander@174
   786
  private:
dvander@195
   787
    ScopedRoot<String> name_;
dvander@174
   788
    FunctionSignature signature_;
dvander@195
   789
    
dvander@174
   790
};
dvander@174
   791
dvander@0
   792
class FunctionStatement : public Statement
dvander@0
   793
{
dvander@195
   794
    ScopedRoot<String> name_;
dvander@195
   795
    TokenKind kind_;
dvander@0
   796
    Statement *body_;
dvander@174
   797
    FunctionSignature signature_;
dvander@71
   798
    bool explicitReturn_;
dvander@195
   799
    FunctionSymbol *sym_;
dvander@195
   800
    Scope *argScope_;
dvander@195
   801
    Scope *varScope_;
dvander@0
   802
dvander@0
   803
  public:
dvander@195
   804
    FunctionStatement(const SourcePosition &pos, Handle<String> name, TokenKind kind,
dvander@195
   805
                      Statement *body, const FunctionSignature &signature, bool explicitReturn)
dvander@25
   806
      : Statement(pos),
dvander@195
   807
        name_(name),
dvander@195
   808
        kind_(kind),
dvander@14
   809
        body_(body),
dvander@174
   810
        signature_(signature),
dvander@195
   811
        explicitReturn_(explicitReturn),
dvander@195
   812
        sym_(NULL),
dvander@195
   813
        argScope_(NULL),
dvander@195
   814
        varScope_(NULL)
dvander@0
   815
    {
dvander@0
   816
    }
dvander@0
   817
dvander@195
   818
    DECLARE_NODE(FunctionStatement);
dvander@195
   819
dvander@195
   820
    Handle<String> name() const {
dvander@195
   821
        return name_;
dvander@0
   822
    }
dvander@0
   823
    Statement *body() const {
dvander@0
   824
        return body_;
dvander@0
   825
    }
dvander@174
   826
    const FunctionSignature &signature() {
dvander@174
   827
        return signature_;
dvander@14
   828
    }
dvander@71
   829
    bool hasExplicitReturn() const {
dvander@71
   830
        return explicitReturn_;
dvander@71
   831
    }
dvander@195
   832
    TokenKind token() const {
dvander@195
   833
        return kind_;
dvander@195
   834
    }
dvander@195
   835
    void setSymbol(FunctionSymbol *sym) {
dvander@195
   836
        assert(!sym_);
dvander@195
   837
        sym_ = sym;
dvander@195
   838
    }
dvander@195
   839
    FunctionSymbol *sym() const {
dvander@195
   840
        return sym_;
dvander@195
   841
    }
dvander@195
   842
    void setScopes(Scope *argScope, Scope *varScope) {
dvander@195
   843
        argScope_ = argScope;
dvander@195
   844
        varScope_ = varScope;
dvander@195
   845
    }
dvander@195
   846
    Scope *argScope() const {
dvander@195
   847
        return argScope_;
dvander@195
   848
    }
dvander@195
   849
    Scope *varScope() const {
dvander@195
   850
        return varScope_;
dvander@195
   851
    }
dvander@0
   852
};
dvander@0
   853
dvander@0
   854
class IfStatement : public Statement
dvander@0
   855
{
dvander@0
   856
    Expression *condition_;
dvander@0
   857
    Statement *ifTrue_;
dvander@0
   858
    Statement *ifFalse_;
dvander@0
   859
dvander@0
   860
  public:
dvander@25
   861
    IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
dvander@25
   862
      : Statement(pos),
dvander@25
   863
        condition_(condition),
dvander@0
   864
        ifTrue_(ifTrue),
dvander@0
   865
        ifFalse_(NULL)
dvander@0
   866
    {
dvander@0
   867
    }
dvander@0
   868
dvander@195
   869
    DECLARE_NODE(IfStatement);
dvander@195
   870
dvander@0
   871
    Expression *condition() const {
dvander@0
   872
        return condition_;
dvander@0
   873
    }
dvander@0
   874
    Statement *ifTrue() const {
dvander@0
   875
        return ifTrue_;
dvander@0
   876
    }
dvander@0
   877
    Statement *ifFalse() const {
dvander@0
   878
        return ifFalse_;
dvander@0
   879
    }
dvander@0
   880
    void setIfFalse(Statement *ifFalse) {
dvander@0
   881
        ifFalse_ = ifFalse;
dvander@0
   882
    }
dvander@0
   883
};
dvander@0
   884
dvander@2
   885
class EnumStatement : public Statement
dvander@2
   886
{
dvander@54
   887
    ScopedRoot<String> name_;
dvander@195
   888
    TypeSymbol *sym_;
dvander@2
   889
dvander@2
   890
  public:
dvander@2
   891
    struct Entry {
dvander@195
   892
        ScopedRoot<String> name;
dvander@2
   893
        Expression *expr;
dvander@233
   894
        SourcePosition pos;
dvander@2
   895
dvander@233
   896
        Entry(Handle<String> name, Expression *expr, const SourcePosition &pos)
dvander@2
   897
          : name(name),
dvander@233
   898
            expr(expr),
dvander@233
   899
            pos(pos)
dvander@2
   900
        {
dvander@2
   901
        }
dvander@2
   902
    };
dvander@2
   903
dvander@57
   904
    typedef PoolList<Entry> EntryList;
dvander@2
   905
dvander@2
   906
  public:
dvander@195
   907
    EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
dvander@25
   908
      : Statement(pos),
dvander@25
   909
        name_(name),
dvander@196
   910
        sym_(NULL),
dvander@196
   911
        entries_(entries)
dvander@2
   912
    {
dvander@2
   913
    }
dvander@2
   914
dvander@195
   915
    DECLARE_NODE(EnumStatement);
dvander@195
   916
dvander@54
   917
    String *name() const {
dvander@2
   918
        return name_;
dvander@2
   919
    }
dvander@2
   920
    EntryList *entries() const {
dvander@2
   921
        return entries_;
dvander@2
   922
    }
dvander@195
   923
    void setSymbol(TypeSymbol *sym) {
dvander@195
   924
        assert(!sym_);
dvander@195
   925
        sym_ = sym;
dvander@145
   926
    }
dvander@195
   927
    TypeSymbol *sym() const {
dvander@195
   928
        return sym_;
dvander@2
   929
    }
dvander@2
   930
dvander@2
   931
  private:
dvander@2
   932
    EntryList *entries_;
dvander@2
   933
};
dvander@2
   934
dvander@23
   935
class IncDecExpression : public Expression
dvander@23
   936
{
dvander@23
   937
    TokenKind token_;
dvander@23
   938
    Expression *expression_;
dvander@23
   939
    bool postfix_;
dvander@23
   940
dvander@23
   941
  public:
dvander@25
   942
    IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
dvander@25
   943
      : Expression(pos),
dvander@25
   944
        token_(token),
dvander@23
   945
        expression_(expression),
dvander@23
   946
        postfix_(postfix)
dvander@23
   947
    {
dvander@23
   948
    }
dvander@23
   949
dvander@195
   950
    DECLARE_NODE(IncDecExpression);
dvander@195
   951
dvander@23
   952
    TokenKind token() const {
dvander@23
   953
        return token_;
dvander@23
   954
    }
dvander@23
   955
    Expression *expression() const {
dvander@23
   956
        return expression_;
dvander@23
   957
    }
dvander@23
   958
    bool postfix() const {
dvander@23
   959
        return postfix_;
dvander@23
   960
    }
dvander@23
   961
};
dvander@23
   962
dvander@172
   963
class Case : public PoolObject
dvander@172
   964
{
dvander@172
   965
  public:
dvander@172
   966
    Case(Expression *expression, ExpressionList *others, Statement *statement)
dvander@172
   967
      : expression_(expression),
dvander@172
   968
        others_(others),
dvander@172
   969
        statement_(statement)
dvander@172
   970
    {
dvander@172
   971
    }
dvander@172
   972
dvander@172
   973
    Expression *expression() const {
dvander@172
   974
        return expression_;
dvander@172
   975
    }
dvander@172
   976
    PoolList<Expression *> *others() const {
dvander@172
   977
        return others_;
dvander@172
   978
    }
dvander@172
   979
    Statement *statement() const {
dvander@172
   980
        return statement_;
dvander@172
   981
    }
dvander@172
   982
dvander@172
   983
  private:
dvander@172
   984
    Expression *expression_;
dvander@172
   985
    PoolList <Expression *> *others_;
dvander@172
   986
    Statement *statement_;
dvander@172
   987
};
dvander@172
   988
dvander@172
   989
struct CaseValue
dvander@172
   990
{
dvander@172
   991
    BoxedPrimitive box;
dvander@172
   992
    size_t statement;
dvander@172
   993
dvander@172
   994
    CaseValue(size_t statement)
dvander@172
   995
      : statement(statement)
dvander@172
   996
    {
dvander@172
   997
    }
dvander@172
   998
};
dvander@172
   999
dvander@172
  1000
typedef PoolList<CaseValue> CaseValueList;
dvander@172
  1001
dvander@172
  1002
class SwitchStatement : public Statement
dvander@172
  1003
{
dvander@172
  1004
  public:
dvander@172
  1005
    SwitchStatement(const SourcePosition &pos, Expression *expression, PoolList<Case *> *cases,
dvander@172
  1006
                    Statement *def)
dvander@172
  1007
      : Statement(pos),
dvander@172
  1008
        expression_(expression),
dvander@172
  1009
        cases_(cases),
dvander@172
  1010
        default_(def),
dvander@172
  1011
        table_(NULL)
dvander@172
  1012
    {
dvander@172
  1013
    }
dvander@172
  1014
dvander@195
  1015
    DECLARE_NODE(SwitchStatement);
dvander@195
  1016
dvander@172
  1017
    Expression *expression() const {
dvander@172
  1018
        return expression_;
dvander@172
  1019
    }
dvander@172
  1020
    PoolList<Case *> *cases() const {
dvander@172
  1021
        return cases_;
dvander@172
  1022
    }
dvander@172
  1023
    Statement *defaultCase() const {
dvander@172
  1024
        return default_;
dvander@172
  1025
    }
dvander@172
  1026
    void setCaseValueList(CaseValueList *list) {
dvander@172
  1027
        table_ = list;
dvander@172
  1028
    }
dvander@172
  1029
    CaseValueList *caseValueList() const {
dvander@172
  1030
        return table_;
dvander@172
  1031
    }
dvander@172
  1032
dvander@172
  1033
  private:
dvander@172
  1034
    Expression *expression_;
dvander@172
  1035
    PoolList<Case *> *cases_;
dvander@172
  1036
    Statement *default_;
dvander@172
  1037
    CaseValueList *table_;
dvander@172
  1038
};
dvander@172
  1039
dvander@146
  1040
class StructureStatement : public Statement
dvander@146
  1041
{
dvander@146
  1042
  public:
dvander@146
  1043
    class Field : public PoolObject
dvander@146
  1044
    {
dvander@146
  1045
        SourcePosition pos_;
dvander@195
  1046
        Expression *type_;
dvander@146
  1047
        ScopedRoot<String> name_;
dvander@146
  1048
dvander@146
  1049
      public:
dvander@146
  1050
        Field(const SourcePosition &pos,
dvander@195
  1051
              Expression *type,
dvander@195
  1052
              Handle<String> name)
dvander@146
  1053
          : pos_(pos),
dvander@146
  1054
            type_(type),
dvander@195
  1055
            name_(name)
dvander@146
  1056
        {
dvander@146
  1057
        }
dvander@146
  1058
dvander@146
  1059
        const SourcePosition &pos() const {
dvander@146
  1060
            return pos_;
dvander@146
  1061
        }
dvander@195
  1062
        Handle<String> name() const {
dvander@146
  1063
            return name_;
dvander@146
  1064
        }
dvander@195
  1065
        Expression *type() const {
dvander@195
  1066
            return type_;
dvander@146
  1067
        }
dvander@146
  1068
    };
dvander@146
  1069
dvander@146
  1070
    typedef PoolList<StructureStatement::Field *> FieldList;
dvander@146
  1071
dvander@146
  1072
  public:
dvander@195
  1073
    StructureStatement(const SourcePosition &pos, Handle<String> name, FieldList *fields)
dvander@146
  1074
      : Statement(pos),
dvander@195
  1075
        name_(name),
dvander@195
  1076
        fields_(fields),
dvander@195
  1077
        sym_(NULL)
dvander@146
  1078
    {
dvander@146
  1079
    }
dvander@146
  1080
dvander@195
  1081
    DECLARE_NODE(StructureStatement);
dvander@195
  1082
dvander@146
  1083
    FieldList *fields() const {
dvander@146
  1084
        return fields_;
dvander@146
  1085
    }
dvander@195
  1086
    Handle<String> name() const {
dvander@195
  1087
        return name_;
dvander@146
  1088
    }
dvander@195
  1089
    void setSymbol(TypeSymbol *sym) {
dvander@195
  1090
        assert(!sym_);
dvander@195
  1091
        sym_ = sym;
dvander@195
  1092
    }
dvander@195
  1093
    TypeSymbol *sym() const {
dvander@195
  1094
        return sym_;
dvander@146
  1095
    }
dvander@146
  1096
dvander@146
  1097
  private:
dvander@195
  1098
    ScopedRoot<String> name_;
dvander@146
  1099
    FieldList *fields_;
dvander@195
  1100
    TypeSymbol *sym_;
dvander@195
  1101
};
dvander@195
  1102
dvander@195
  1103
typedef PoolList<ScopedRoot<String> *> NameList;
dvander@195
  1104
dvander@195
  1105
class ImportStatement : public Statement
dvander@195
  1106
{
dvander@195
  1107
  public:
dvander@251
  1108
    ImportStatement(const SourcePosition &pos, PathComponent *path, TokenKind suffix)
dvander@195
  1109
      : Statement(pos),
dvander@251
  1110
        path_(path),
dvander@195
  1111
        suffix_(suffix),
dvander@195
  1112
        source_(NULL)
dvander@195
  1113
    {
dvander@195
  1114
    }
dvander@195
  1115
dvander@195
  1116
    DECLARE_NODE(ImportStatement);
dvander@195
  1117
dvander@251
  1118
    PathComponent *path() const {
dvander@251
  1119
        return path_;
dvander@195
  1120
    }
dvander@195
  1121
    void setImportSource(TranslationUnit *unit) {
dvander@195
  1122
        source_ = unit;
dvander@195
  1123
    }
dvander@195
  1124
    TranslationUnit *source() const {
dvander@195
  1125
        return source_;
dvander@195
  1126
    }
dvander@195
  1127
    TokenKind suffix() const {
dvander@195
  1128
        return suffix_;
dvander@195
  1129
    }
dvander@195
  1130
dvander@195
  1131
  private:
dvander@251
  1132
    PathComponent *path_;
dvander@195
  1133
    TokenKind suffix_;
dvander@195
  1134
    TranslationUnit *source_;
dvander@146
  1135
};
dvander@146
  1136
dvander@146
  1137
typedef StructureStatement::FieldList FieldList;
dvander@195
  1138
typedef PoolList<NameProxy *> NameProxyList;
dvander@146
  1139
dvander@195
  1140
#undef DECLARE_NODE
dvander@0
  1141
dvander@0
  1142
class ParseTree : public PoolObject
dvander@0
  1143
{
dvander@0
  1144
    StatementList *statements_;
dvander@0
  1145
    NameProxyList *unbound_;
dvander@195
  1146
    PoolList<ImportStatement *> *imports_;
dvander@0
  1147
dvander@0
  1148
  public:
dvander@195
  1149
    ParseTree(StatementList *statements, NameProxyList *unbound, PoolList<ImportStatement *> *imports)
dvander@0
  1150
      : statements_(statements),
dvander@195
  1151
        unbound_(unbound),
dvander@195
  1152
        imports_(imports)
dvander@0
  1153
    {
dvander@0
  1154
    }
dvander@0
  1155
dvander@0
  1156
    void dump(FILE *fp);
dvander@0
  1157
dvander@0
  1158
    StatementList *statements() const {
dvander@0
  1159
        return statements_;
dvander@0
  1160
    }
dvander@0
  1161
    NameProxyList *unbound() const {
dvander@0
  1162
        return unbound_;
dvander@0
  1163
    }
dvander@195
  1164
    PoolList<ImportStatement *> *imports() const {
dvander@195
  1165
        return imports_;
dvander@195
  1166
    }
dvander@0
  1167
};
dvander@0
  1168
dvander@0
  1169
}
dvander@0
  1170
dvander@168
  1171
#endif // _include_sourcepawn_ast_h_