src/compiler/AST.h
author David Anderson <dvander@alliedmods.net>
Sun Nov 18 14:53:23 2012 -0800 (2012-11-18)
changeset 212 443d24cfdf2d
parent 209 5cbec15fadfe
child 220 5df4a112967d
permissions -rw-r--r--
Added array support back.
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@195
    27
#include "../QualType.h"
dvander@0
    28
dvander@59
    29
namespace ke {
dvander@0
    30
dvander@195
    31
class Scope;
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@195
    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@0
   197
};
dvander@0
   198
dvander@14
   199
class Parameter : public PoolObject
dvander@14
   200
{
dvander@195
   201
    ScopedRoot<String> name_;
dvander@195
   202
    Expression *type_;
dvander@14
   203
    bool reference_;
dvander@67
   204
    bool const_;
dvander@133
   205
    Expression *initializer_;
dvander@195
   206
    VariableSymbol *sym_;
dvander@195
   207
    SourcePosition pos_;
dvander@14
   208
dvander@14
   209
  public:
dvander@195
   210
    Parameter(Handle<String> name, Expression *type, bool reference, bool isConst,
dvander@195
   211
              Expression *initializer, const SourcePosition &pos)
dvander@195
   212
      : name_(name),
dvander@145
   213
        type_(type),
dvander@66
   214
        reference_(reference),
dvander@67
   215
        const_(isConst),
dvander@195
   216
        initializer_(initializer),
dvander@195
   217
        sym_(NULL),
dvander@195
   218
        pos_(pos)
dvander@14
   219
    {
dvander@14
   220
    }
dvander@14
   221
dvander@195
   222
    Expression *type() const {
dvander@145
   223
        return type_;
dvander@14
   224
    }
dvander@195
   225
    Handle<String> name() const {
dvander@195
   226
        return name_;
dvander@14
   227
    }
dvander@14
   228
    bool reference() const {
dvander@14
   229
        return reference_;
dvander@14
   230
    }
dvander@67
   231
    bool isConst() const {
dvander@67
   232
        return const_;
dvander@67
   233
    }
dvander@133
   234
    Expression *initializer() const {
dvander@133
   235
        return initializer_;
dvander@133
   236
    }
dvander@195
   237
    void setSymbol(VariableSymbol *sym) {
dvander@195
   238
        assert(!sym_);
dvander@195
   239
        sym_ = sym;
dvander@195
   240
    }
dvander@195
   241
    VariableSymbol *sym() const {
dvander@195
   242
        return sym_;
dvander@195
   243
    }
dvander@195
   244
    const SourcePosition &pos() const {
dvander@195
   245
        return pos_;
dvander@195
   246
    }
dvander@14
   247
};
dvander@14
   248
dvander@0
   249
class NameProxy : public Expression
dvander@0
   250
{
dvander@54
   251
    ScopedRoot<String> name_;
dvander@195
   252
    Symbol *binding_;
dvander@0
   253
dvander@0
   254
  public:
dvander@195
   255
    NameProxy(const SourcePosition &pos, Handle<String> name)
dvander@25
   256
      : Expression(pos),
dvander@25
   257
        name_(name),
dvander@195
   258
        binding_(NULL)
dvander@0
   259
    {
dvander@0
   260
    }
dvander@0
   261
dvander@195
   262
    DECLARE_NODE(NameProxy);
dvander@195
   263
    
dvander@195
   264
    Handle<String> name() const {
dvander@0
   265
        return name_;
dvander@0
   266
    }
dvander@195
   267
    Symbol *sym() const {
dvander@0
   268
        return binding_;
dvander@0
   269
    }
dvander@195
   270
    void bind(Symbol *sym) {
dvander@195
   271
        binding_ = sym;
dvander@0
   272
    }
dvander@0
   273
};
dvander@0
   274
dvander@143
   275
class BooleanLiteral : public Expression
dvander@143
   276
{
dvander@143
   277
    TokenKind token_;
dvander@143
   278
dvander@143
   279
  public:
dvander@143
   280
    BooleanLiteral(const SourcePosition &pos, TokenKind token)
dvander@143
   281
      : Expression(pos),
dvander@143
   282
        token_(token)
dvander@143
   283
    {
dvander@143
   284
    }
dvander@143
   285
dvander@195
   286
    DECLARE_NODE(BooleanLiteral);
dvander@143
   287
    TokenKind token() const {
dvander@143
   288
        return token_;
dvander@143
   289
    }
dvander@143
   290
};
dvander@143
   291
dvander@4
   292
class IntegerLiteral : public Expression
dvander@0
   293
{
dvander@0
   294
    int value_;
dvander@0
   295
dvander@0
   296
  public:
dvander@25
   297
    IntegerLiteral(const SourcePosition &pos, int value)
dvander@25
   298
      : Expression(pos),
dvander@25
   299
        value_(value)
dvander@0
   300
    {
dvander@0
   301
    }
dvander@0
   302
dvander@195
   303
    DECLARE_NODE(IntegerLiteral);
dvander@195
   304
dvander@0
   305
    int value() const {
dvander@0
   306
        return value_;
dvander@0
   307
    }
dvander@0
   308
};
dvander@0
   309
dvander@4
   310
class FloatLiteral : public Expression
dvander@4
   311
{
dvander@4
   312
    double value_;
dvander@4
   313
dvander@4
   314
  public:
dvander@25
   315
    FloatLiteral(const SourcePosition &pos, double value)
dvander@25
   316
      : Expression(pos),
dvander@25
   317
        value_(value)
dvander@4
   318
    {
dvander@4
   319
    }
dvander@4
   320
dvander@195
   321
    DECLARE_NODE(FloatLiteral);
dvander@195
   322
dvander@4
   323
    double value() const {
dvander@4
   324
        return value_;
dvander@4
   325
    }
dvander@4
   326
};
dvander@4
   327
dvander@21
   328
class StringLiteral : public Expression
dvander@21
   329
{
dvander@29
   330
    ScopedRoot<ByteArray> string_;
dvander@21
   331
dvander@21
   332
  public:
dvander@25
   333
    StringLiteral(const SourcePosition &pos, ByteArray *array)
dvander@25
   334
      : Expression(pos),
dvander@25
   335
        string_(array)
dvander@21
   336
    {
dvander@21
   337
    }
dvander@21
   338
dvander@195
   339
    DECLARE_NODE(StringLiteral);
dvander@195
   340
dvander@21
   341
    ByteArray *string() const {
dvander@21
   342
        return string_;
dvander@21
   343
    }
dvander@21
   344
};
dvander@21
   345
dvander@187
   346
class ArrayLiteral : public Expression
dvander@187
   347
{
dvander@187
   348
    TokenKind token_;
dvander@187
   349
    ExpressionList *expressions_;
dvander@187
   350
dvander@187
   351
  public:
dvander@187
   352
    ArrayLiteral(const SourcePosition &pos, TokenKind token, ExpressionList *expressions)
dvander@187
   353
      : Expression(pos),
dvander@187
   354
        token_(token),
dvander@187
   355
        expressions_(expressions)
dvander@187
   356
    {
dvander@187
   357
    }
dvander@187
   358
dvander@195
   359
    DECLARE_NODE(ArrayLiteral);
dvander@195
   360
dvander@187
   361
    TokenKind token() const {
dvander@187
   362
        return token_;
dvander@187
   363
    }
dvander@187
   364
    ExpressionList *expressions() const {
dvander@187
   365
        return expressions_;
dvander@187
   366
    }
dvander@187
   367
    bool isFixed() const {
dvander@187
   368
        return token_ == TOK_LBRACE;
dvander@187
   369
    }
dvander@187
   370
};
dvander@187
   371
dvander@78
   372
class UnaryExpression : public Expression
dvander@78
   373
{
dvander@78
   374
    Expression *expression_;
dvander@78
   375
    TokenKind token_;
dvander@195
   376
    NameProxy *tag_;
dvander@78
   377
dvander@78
   378
  public:
dvander@78
   379
    UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr)
dvander@78
   380
      : Expression(pos),
dvander@78
   381
        expression_(expr),
dvander@195
   382
        token_(token),
dvander@195
   383
        tag_(NULL)
dvander@78
   384
    {
dvander@78
   385
    }
dvander@78
   386
dvander@142
   387
    UnaryExpression(const SourcePosition &pos, TokenKind token, Expression *expr,
dvander@195
   388
                    NameProxy *tag)
dvander@142
   389
      : Expression(pos),
dvander@142
   390
        expression_(expr),
dvander@142
   391
        token_(token),
dvander@195
   392
        tag_(tag)
dvander@142
   393
    {
dvander@142
   394
    }
dvander@142
   395
dvander@195
   396
    DECLARE_NODE(UnaryExpression);
dvander@195
   397
dvander@78
   398
    Expression *expression() const {
dvander@78
   399
        return expression_;
dvander@78
   400
    }
dvander@78
   401
    TokenKind token() const {
dvander@78
   402
        return token_;
dvander@78
   403
    }
dvander@195
   404
    NameProxy *tag() const {
dvander@195
   405
        return tag_;
dvander@78
   406
    }
dvander@78
   407
};
dvander@78
   408
dvander@0
   409
class BinaryExpression : public Expression
dvander@0
   410
{
dvander@0
   411
    Expression *left_;
dvander@0
   412
    Expression *right_;
dvander@0
   413
    TokenKind token_;
dvander@0
   414
dvander@0
   415
  public:
dvander@25
   416
    BinaryExpression(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   417
      : Expression(pos),
dvander@0
   418
        left_(left),
dvander@28
   419
        right_(right),
dvander@28
   420
        token_(token)
dvander@0
   421
    {
dvander@0
   422
    }
dvander@0
   423
dvander@195
   424
    DECLARE_NODE(BinaryExpression);
dvander@195
   425
dvander@0
   426
    Expression *left() const {
dvander@0
   427
        return left_;
dvander@0
   428
    }
dvander@0
   429
    Expression *right() const {
dvander@0
   430
        return right_;
dvander@0
   431
    }
dvander@0
   432
    TokenKind token() const {
dvander@0
   433
        return token_;
dvander@0
   434
    }
dvander@0
   435
};
dvander@0
   436
dvander@83
   437
class TernaryExpression : public Expression
dvander@83
   438
{
dvander@83
   439
    Expression *condition_;
dvander@83
   440
    Expression *left_;
dvander@83
   441
    Expression *right_;
dvander@83
   442
dvander@83
   443
  public:
dvander@83
   444
    TernaryExpression(const SourcePosition &pos, Expression *condition, Expression *left, Expression *right)
dvander@83
   445
      : Expression(pos),
dvander@83
   446
        condition_(condition),
dvander@83
   447
        left_(left),
dvander@83
   448
        right_(right)
dvander@83
   449
    {
dvander@83
   450
    }
dvander@83
   451
dvander@195
   452
    DECLARE_NODE(TernaryExpression);
dvander@195
   453
dvander@83
   454
    Expression *condition() const {
dvander@83
   455
        return condition_;
dvander@83
   456
    }
dvander@83
   457
    Expression *left() const {
dvander@83
   458
        return left_;
dvander@83
   459
    }
dvander@83
   460
    Expression *right() const {
dvander@83
   461
        return right_;
dvander@83
   462
    }
dvander@83
   463
};
dvander@83
   464
dvander@0
   465
class IndexExpression : public Expression
dvander@0
   466
{
dvander@0
   467
    Expression *left_;
dvander@0
   468
    Expression *right_;
dvander@0
   469
dvander@0
   470
  public:
dvander@25
   471
    IndexExpression(const SourcePosition &pos, Expression *left, Expression *right)
dvander@25
   472
      : Expression(pos),
dvander@25
   473
        left_(left),
dvander@0
   474
        right_(right)
dvander@0
   475
    {
dvander@0
   476
    }
dvander@0
   477
dvander@195
   478
    DECLARE_NODE(IndexExpression);
dvander@195
   479
dvander@0
   480
    Expression *left() const {
dvander@0
   481
        return left_;
dvander@0
   482
    }
dvander@0
   483
    Expression *right() const {
dvander@0
   484
        return right_;
dvander@0
   485
    }
dvander@0
   486
};
dvander@0
   487
dvander@148
   488
class FieldExpression : public Expression
dvander@148
   489
{
dvander@148
   490
    Expression *left_;
dvander@148
   491
    ScopedRoot<String> field_;
dvander@148
   492
    unsigned fieldIndex_;
dvander@148
   493
dvander@148
   494
  public:
dvander@148
   495
    FieldExpression(const SourcePosition &pos, Expression *left, Handle<String> field)
dvander@148
   496
      : Expression(pos),
dvander@148
   497
        left_(left),
dvander@148
   498
        field_(field),
dvander@148
   499
        fieldIndex_(unsigned(-1))
dvander@148
   500
    {
dvander@148
   501
    }
dvander@148
   502
dvander@195
   503
    DECLARE_NODE(FieldExpression);
dvander@195
   504
dvander@148
   505
    Expression *left() const {
dvander@148
   506
        return left_;
dvander@148
   507
    }
dvander@148
   508
    String *field() const {
dvander@148
   509
        return field_;
dvander@148
   510
    }
dvander@148
   511
    void setFieldIndex(unsigned index) {
dvander@148
   512
        assert(fieldIndex_ == unsigned(-1));
dvander@148
   513
        fieldIndex_ = index;
dvander@148
   514
    }
dvander@148
   515
    unsigned fieldIndex() const {
dvander@148
   516
        assert(fieldIndex_ != unsigned(-1));
dvander@148
   517
        return fieldIndex_;
dvander@148
   518
    }
dvander@148
   519
};
dvander@148
   520
dvander@0
   521
class CallExpression : public Expression
dvander@0
   522
{
dvander@0
   523
    Expression *callee_;
dvander@0
   524
    ExpressionList *arguments_;
dvander@0
   525
dvander@0
   526
  public:
dvander@25
   527
    CallExpression(const SourcePosition &pos, Expression *callee, ExpressionList *arguments)
dvander@25
   528
      : Expression(pos),
dvander@25
   529
        callee_(callee),
dvander@0
   530
        arguments_(arguments)
dvander@0
   531
    {
dvander@0
   532
    }
dvander@0
   533
dvander@195
   534
    DECLARE_NODE(CallExpression);
dvander@195
   535
dvander@0
   536
    Expression *callee() const {
dvander@0
   537
        return callee_;
dvander@0
   538
    }
dvander@0
   539
    ExpressionList *arguments() const {
dvander@0
   540
        return arguments_;
dvander@0
   541
    }
dvander@0
   542
};
dvander@0
   543
dvander@0
   544
class ForStatement : public Statement
dvander@0
   545
{
dvander@22
   546
    Statement *initialization_;
dvander@0
   547
    Expression *condition_;
dvander@0
   548
    Statement *update_;
dvander@0
   549
    Statement *body_;
dvander@195
   550
    Scope *scope_;
dvander@0
   551
dvander@0
   552
  public:
dvander@195
   553
    ForStatement(const SourcePosition &pos, Statement *initialization,
dvander@0
   554
                 Expression *condition, Statement *update, Statement *body)
dvander@25
   555
      : Statement(pos),
dvander@22
   556
        initialization_(initialization),
dvander@0
   557
        condition_(condition),
dvander@0
   558
        update_(update),
dvander@195
   559
        body_(body),
dvander@195
   560
        scope_(NULL)
dvander@0
   561
    {
dvander@0
   562
    }
dvander@0
   563
dvander@195
   564
    DECLARE_NODE(ForStatement);
dvander@195
   565
dvander@22
   566
    Statement *initialization() const {
dvander@22
   567
        return initialization_;
dvander@0
   568
    }
dvander@0
   569
    Expression *condition() const {
dvander@0
   570
        return condition_;
dvander@0
   571
    }
dvander@0
   572
    Statement *update() const {
dvander@0
   573
        return update_;
dvander@0
   574
    }
dvander@0
   575
    Statement *body() const {
dvander@0
   576
        return body_;
dvander@0
   577
    }
dvander@195
   578
    Scope *scope() const {
dvander@195
   579
        return scope_;
dvander@195
   580
    }
dvander@195
   581
    void setScope(Scope *scope) {
dvander@195
   582
        scope_ = scope;
dvander@0
   583
    }
dvander@0
   584
};
dvander@0
   585
dvander@9
   586
class WhileStatement : public Statement
dvander@9
   587
{
dvander@9
   588
    TokenKind token_;
dvander@9
   589
    Expression *condition_;
dvander@9
   590
    Statement *body_;
dvander@9
   591
dvander@9
   592
  public:
dvander@25
   593
    WhileStatement(const SourcePosition &pos, TokenKind kind, Expression *condition, Statement *body)
dvander@25
   594
      : Statement(pos),
dvander@25
   595
        token_(kind),
dvander@9
   596
        condition_(condition),
dvander@9
   597
        body_(body)
dvander@9
   598
    {
dvander@9
   599
    }
dvander@9
   600
    
dvander@195
   601
    DECLARE_NODE(WhileStatement);
dvander@195
   602
dvander@9
   603
    TokenKind token() const {
dvander@9
   604
        return token_;
dvander@9
   605
    }
dvander@9
   606
    Expression *condition() const {
dvander@9
   607
        return condition_;
dvander@9
   608
    }
dvander@9
   609
    Statement *body() const {
dvander@9
   610
        return body_;
dvander@9
   611
    }
dvander@9
   612
};
dvander@9
   613
dvander@0
   614
class ReturnStatement : public Statement
dvander@0
   615
{
dvander@0
   616
    Expression *expression_;
dvander@0
   617
dvander@0
   618
  public:
dvander@25
   619
    ReturnStatement(const SourcePosition &pos, Expression *expression)
dvander@25
   620
      : Statement(pos),
dvander@25
   621
        expression_(expression)
dvander@0
   622
    {
dvander@0
   623
    }
dvander@0
   624
dvander@195
   625
    DECLARE_NODE(ReturnStatement);
dvander@195
   626
dvander@0
   627
    Expression *expression() const {
dvander@0
   628
        return expression_;
dvander@0
   629
    }
dvander@0
   630
};
dvander@0
   631
dvander@10
   632
class BreakStatement : public Statement
dvander@10
   633
{
dvander@10
   634
  public:
dvander@25
   635
    BreakStatement(const SourcePosition &pos)
dvander@25
   636
      : Statement(pos)
dvander@10
   637
    {
dvander@10
   638
    }
dvander@10
   639
dvander@195
   640
    DECLARE_NODE(BreakStatement);
dvander@10
   641
};
dvander@10
   642
dvander@10
   643
class ContinueStatement : public Statement
dvander@10
   644
{
dvander@10
   645
  public:
dvander@25
   646
    ContinueStatement(const SourcePosition &pos)
dvander@25
   647
      : Statement(pos)
dvander@10
   648
    {
dvander@10
   649
    }
dvander@10
   650
dvander@195
   651
    DECLARE_NODE(ContinueStatement);
dvander@10
   652
};
dvander@10
   653
dvander@0
   654
class Assignment : public Expression
dvander@0
   655
{
dvander@22
   656
    TokenKind token_;
dvander@0
   657
    Expression *lvalue_;
dvander@0
   658
    Expression *expression_;
dvander@0
   659
dvander@0
   660
  public:
dvander@25
   661
    Assignment(const SourcePosition &pos, TokenKind token, Expression *left, Expression *right)
dvander@25
   662
      : Expression(pos),
dvander@25
   663
        token_(token),
dvander@22
   664
        lvalue_(left),
dvander@0
   665
        expression_(right)
dvander@0
   666
    {
dvander@0
   667
    }
dvander@0
   668
dvander@195
   669
    DECLARE_NODE(Assignment);
dvander@195
   670
dvander@22
   671
    TokenKind token() const {
dvander@22
   672
        return token_;
dvander@22
   673
    }
dvander@0
   674
    Expression *lvalue() const {
dvander@0
   675
        return lvalue_;
dvander@0
   676
    }
dvander@0
   677
    Expression *expression() const {
dvander@0
   678
        return expression_;
dvander@0
   679
    }
dvander@0
   680
};
dvander@0
   681
dvander@0
   682
class ExpressionStatement : public Statement
dvander@0
   683
{
dvander@0
   684
    Expression *expression_;
dvander@0
   685
dvander@0
   686
  public:
dvander@0
   687
    ExpressionStatement(Expression *expression)
dvander@25
   688
      : Statement(expression->pos()),
dvander@25
   689
        expression_(expression)
dvander@0
   690
    {
dvander@0
   691
    }
dvander@0
   692
dvander@195
   693
    DECLARE_NODE(ExpressionStatement);
dvander@195
   694
dvander@0
   695
    Expression *expression() const {
dvander@0
   696
        return expression_;
dvander@0
   697
    }
dvander@0
   698
};
dvander@0
   699
dvander@0
   700
class BlockStatement : public Statement
dvander@0
   701
{
dvander@195
   702
    StatementList *statements_;
dvander@0
   703
    Scope *scope_;
dvander@0
   704
dvander@0
   705
  public:
dvander@195
   706
    BlockStatement(const SourcePosition &pos, StatementList *statements)
dvander@25
   707
      : Statement(pos),
dvander@195
   708
        statements_(statements),
dvander@195
   709
        scope_(NULL)
dvander@0
   710
    {
dvander@0
   711
    }
dvander@0
   712
dvander@195
   713
    DECLARE_NODE(BlockStatement);
dvander@195
   714
dvander@195
   715
    StatementList *statements() const {
dvander@195
   716
        return statements_;
dvander@0
   717
    }
dvander@0
   718
    Scope *scope() const {
dvander@0
   719
        return scope_;
dvander@0
   720
    }
dvander@195
   721
    void setScope(Scope *scope) {
dvander@195
   722
        scope_ = scope;
dvander@0
   723
    }
dvander@0
   724
};
dvander@0
   725
dvander@57
   726
typedef PoolList<Parameter *> ParameterList;
dvander@14
   727
dvander@174
   728
class FunctionSignature
dvander@174
   729
{
dvander@174
   730
  public:
dvander@195
   731
    FunctionSignature(Expression *returnType, ParameterList *parameters, bool variadic)
dvander@174
   732
      : returnType_(returnType),
dvander@195
   733
        parameters_(parameters),
dvander@195
   734
        variadic_(variadic)
dvander@174
   735
    {
dvander@174
   736
    }
dvander@174
   737
dvander@195
   738
    Expression *returnType() const {
dvander@174
   739
        return returnType_;
dvander@174
   740
    }
dvander@174
   741
    ParameterList *parameters() const {
dvander@174
   742
        return parameters_;
dvander@174
   743
    }
dvander@195
   744
    bool variadic() const {
dvander@195
   745
        return variadic_;
dvander@195
   746
    }
dvander@174
   747
dvander@174
   748
  private:
dvander@195
   749
    Expression *returnType_;
dvander@174
   750
    ParameterList *parameters_;
dvander@195
   751
    bool variadic_;
dvander@174
   752
};
dvander@174
   753
dvander@174
   754
class FunctionTypeStatement : public Statement
dvander@174
   755
{
dvander@174
   756
  public:
dvander@195
   757
    FunctionTypeStatement(const SourcePosition &pos, Handle<String> name, const FunctionSignature &signature)
dvander@174
   758
      : Statement(pos),
dvander@195
   759
        name_(name),
dvander@174
   760
        signature_(signature)
dvander@174
   761
    {
dvander@174
   762
    }
dvander@174
   763
dvander@195
   764
    DECLARE_NODE(FunctionTypeStatement);
dvander@195
   765
dvander@195
   766
    Handle<String> name() const {
dvander@195
   767
        return name_;
dvander@174
   768
    }
dvander@174
   769
    const FunctionSignature &signature() const {
dvander@174
   770
        return signature_;
dvander@174
   771
    }
dvander@174
   772
dvander@174
   773
  private:
dvander@195
   774
    ScopedRoot<String> name_;
dvander@174
   775
    FunctionSignature signature_;
dvander@195
   776
    
dvander@174
   777
};
dvander@174
   778
dvander@0
   779
class FunctionStatement : public Statement
dvander@0
   780
{
dvander@195
   781
    ScopedRoot<String> name_;
dvander@195
   782
    TokenKind kind_;
dvander@0
   783
    Statement *body_;
dvander@174
   784
    FunctionSignature signature_;
dvander@71
   785
    bool explicitReturn_;
dvander@195
   786
    FunctionSymbol *sym_;
dvander@195
   787
    Scope *argScope_;
dvander@195
   788
    Scope *varScope_;
dvander@0
   789
dvander@0
   790
  public:
dvander@195
   791
    FunctionStatement(const SourcePosition &pos, Handle<String> name, TokenKind kind,
dvander@195
   792
                      Statement *body, const FunctionSignature &signature, bool explicitReturn)
dvander@25
   793
      : Statement(pos),
dvander@195
   794
        name_(name),
dvander@195
   795
        kind_(kind),
dvander@14
   796
        body_(body),
dvander@174
   797
        signature_(signature),
dvander@195
   798
        explicitReturn_(explicitReturn),
dvander@195
   799
        sym_(NULL),
dvander@195
   800
        argScope_(NULL),
dvander@195
   801
        varScope_(NULL)
dvander@0
   802
    {
dvander@0
   803
    }
dvander@0
   804
dvander@195
   805
    DECLARE_NODE(FunctionStatement);
dvander@195
   806
dvander@195
   807
    Handle<String> name() const {
dvander@195
   808
        return name_;
dvander@0
   809
    }
dvander@0
   810
    Statement *body() const {
dvander@0
   811
        return body_;
dvander@0
   812
    }
dvander@174
   813
    const FunctionSignature &signature() {
dvander@174
   814
        return signature_;
dvander@14
   815
    }
dvander@71
   816
    bool hasExplicitReturn() const {
dvander@71
   817
        return explicitReturn_;
dvander@71
   818
    }
dvander@195
   819
    TokenKind token() const {
dvander@195
   820
        return kind_;
dvander@195
   821
    }
dvander@195
   822
    void setSymbol(FunctionSymbol *sym) {
dvander@195
   823
        assert(!sym_);
dvander@195
   824
        sym_ = sym;
dvander@195
   825
    }
dvander@195
   826
    FunctionSymbol *sym() const {
dvander@195
   827
        return sym_;
dvander@195
   828
    }
dvander@195
   829
    void setScopes(Scope *argScope, Scope *varScope) {
dvander@195
   830
        argScope_ = argScope;
dvander@195
   831
        varScope_ = varScope;
dvander@195
   832
    }
dvander@195
   833
    Scope *argScope() const {
dvander@195
   834
        return argScope_;
dvander@195
   835
    }
dvander@195
   836
    Scope *varScope() const {
dvander@195
   837
        return varScope_;
dvander@195
   838
    }
dvander@0
   839
};
dvander@0
   840
dvander@0
   841
class IfStatement : public Statement
dvander@0
   842
{
dvander@0
   843
    Expression *condition_;
dvander@0
   844
    Statement *ifTrue_;
dvander@0
   845
    Statement *ifFalse_;
dvander@0
   846
dvander@0
   847
  public:
dvander@25
   848
    IfStatement(const SourcePosition &pos, Expression *condition, Statement *ifTrue)
dvander@25
   849
      : Statement(pos),
dvander@25
   850
        condition_(condition),
dvander@0
   851
        ifTrue_(ifTrue),
dvander@0
   852
        ifFalse_(NULL)
dvander@0
   853
    {
dvander@0
   854
    }
dvander@0
   855
dvander@195
   856
    DECLARE_NODE(IfStatement);
dvander@195
   857
dvander@0
   858
    Expression *condition() const {
dvander@0
   859
        return condition_;
dvander@0
   860
    }
dvander@0
   861
    Statement *ifTrue() const {
dvander@0
   862
        return ifTrue_;
dvander@0
   863
    }
dvander@0
   864
    Statement *ifFalse() const {
dvander@0
   865
        return ifFalse_;
dvander@0
   866
    }
dvander@0
   867
    void setIfFalse(Statement *ifFalse) {
dvander@0
   868
        ifFalse_ = ifFalse;
dvander@0
   869
    }
dvander@0
   870
};
dvander@0
   871
dvander@2
   872
class EnumStatement : public Statement
dvander@2
   873
{
dvander@54
   874
    ScopedRoot<String> name_;
dvander@195
   875
    TypeSymbol *sym_;
dvander@2
   876
dvander@2
   877
  public:
dvander@2
   878
    struct Entry {
dvander@195
   879
        ScopedRoot<String> name;
dvander@2
   880
        Expression *expr;
dvander@2
   881
dvander@195
   882
        Entry(Handle<String> name, Expression *expr)
dvander@2
   883
          : name(name),
dvander@2
   884
            expr(expr)
dvander@2
   885
        {
dvander@2
   886
        }
dvander@2
   887
    };
dvander@2
   888
dvander@57
   889
    typedef PoolList<Entry> EntryList;
dvander@2
   890
dvander@2
   891
  public:
dvander@195
   892
    EnumStatement(const SourcePosition &pos, Handle<String> name, EntryList *entries)
dvander@25
   893
      : Statement(pos),
dvander@25
   894
        name_(name),
dvander@196
   895
        sym_(NULL),
dvander@196
   896
        entries_(entries)
dvander@2
   897
    {
dvander@2
   898
    }
dvander@2
   899
dvander@195
   900
    DECLARE_NODE(EnumStatement);
dvander@195
   901
dvander@54
   902
    String *name() const {
dvander@2
   903
        return name_;
dvander@2
   904
    }
dvander@2
   905
    EntryList *entries() const {
dvander@2
   906
        return entries_;
dvander@2
   907
    }
dvander@195
   908
    void setSymbol(TypeSymbol *sym) {
dvander@195
   909
        assert(!sym_);
dvander@195
   910
        sym_ = sym;
dvander@145
   911
    }
dvander@195
   912
    TypeSymbol *sym() const {
dvander@195
   913
        return sym_;
dvander@2
   914
    }
dvander@2
   915
dvander@2
   916
  private:
dvander@2
   917
    EntryList *entries_;
dvander@2
   918
};
dvander@2
   919
dvander@23
   920
class IncDecExpression : public Expression
dvander@23
   921
{
dvander@23
   922
    TokenKind token_;
dvander@23
   923
    Expression *expression_;
dvander@23
   924
    bool postfix_;
dvander@23
   925
dvander@23
   926
  public:
dvander@25
   927
    IncDecExpression(const SourcePosition &pos, TokenKind token, Expression *expression, bool postfix)
dvander@25
   928
      : Expression(pos),
dvander@25
   929
        token_(token),
dvander@23
   930
        expression_(expression),
dvander@23
   931
        postfix_(postfix)
dvander@23
   932
    {
dvander@23
   933
    }
dvander@23
   934
dvander@195
   935
    DECLARE_NODE(IncDecExpression);
dvander@195
   936
dvander@23
   937
    TokenKind token() const {
dvander@23
   938
        return token_;
dvander@23
   939
    }
dvander@23
   940
    Expression *expression() const {
dvander@23
   941
        return expression_;
dvander@23
   942
    }
dvander@23
   943
    bool postfix() const {
dvander@23
   944
        return postfix_;
dvander@23
   945
    }
dvander@23
   946
};
dvander@23
   947
dvander@172
   948
class Case : public PoolObject
dvander@172
   949
{
dvander@172
   950
  public:
dvander@172
   951
    Case(Expression *expression, ExpressionList *others, Statement *statement)
dvander@172
   952
      : expression_(expression),
dvander@172
   953
        others_(others),
dvander@172
   954
        statement_(statement)
dvander@172
   955
    {
dvander@172
   956
    }
dvander@172
   957
dvander@172
   958
    Expression *expression() const {
dvander@172
   959
        return expression_;
dvander@172
   960
    }
dvander@172
   961
    PoolList<Expression *> *others() const {
dvander@172
   962
        return others_;
dvander@172
   963
    }
dvander@172
   964
    Statement *statement() const {
dvander@172
   965
        return statement_;
dvander@172
   966
    }
dvander@172
   967
dvander@172
   968
  private:
dvander@172
   969
    Expression *expression_;
dvander@172
   970
    PoolList <Expression *> *others_;
dvander@172
   971
    Statement *statement_;
dvander@172
   972
};
dvander@172
   973
dvander@172
   974
struct CaseValue
dvander@172
   975
{
dvander@172
   976
    BoxedPrimitive box;
dvander@172
   977
    size_t statement;
dvander@172
   978
dvander@172
   979
    CaseValue(size_t statement)
dvander@172
   980
      : statement(statement)
dvander@172
   981
    {
dvander@172
   982
    }
dvander@172
   983
};
dvander@172
   984
dvander@172
   985
typedef PoolList<CaseValue> CaseValueList;
dvander@172
   986
dvander@172
   987
class SwitchStatement : public Statement
dvander@172
   988
{
dvander@172
   989
  public:
dvander@172
   990
    SwitchStatement(const SourcePosition &pos, Expression *expression, PoolList<Case *> *cases,
dvander@172
   991
                    Statement *def)
dvander@172
   992
      : Statement(pos),
dvander@172
   993
        expression_(expression),
dvander@172
   994
        cases_(cases),
dvander@172
   995
        default_(def),
dvander@172
   996
        table_(NULL)
dvander@172
   997
    {
dvander@172
   998
    }
dvander@172
   999
dvander@195
  1000
    DECLARE_NODE(SwitchStatement);
dvander@195
  1001
dvander@172
  1002
    Expression *expression() const {
dvander@172
  1003
        return expression_;
dvander@172
  1004
    }
dvander@172
  1005
    PoolList<Case *> *cases() const {
dvander@172
  1006
        return cases_;
dvander@172
  1007
    }
dvander@172
  1008
    Statement *defaultCase() const {
dvander@172
  1009
        return default_;
dvander@172
  1010
    }
dvander@172
  1011
    void setCaseValueList(CaseValueList *list) {
dvander@172
  1012
        table_ = list;
dvander@172
  1013
    }
dvander@172
  1014
    CaseValueList *caseValueList() const {
dvander@172
  1015
        return table_;
dvander@172
  1016
    }
dvander@172
  1017
dvander@172
  1018
  private:
dvander@172
  1019
    Expression *expression_;
dvander@172
  1020
    PoolList<Case *> *cases_;
dvander@172
  1021
    Statement *default_;
dvander@172
  1022
    CaseValueList *table_;
dvander@172
  1023
};
dvander@172
  1024
dvander@146
  1025
class StructureStatement : public Statement
dvander@146
  1026
{
dvander@146
  1027
  public:
dvander@146
  1028
    class Field : public PoolObject
dvander@146
  1029
    {
dvander@146
  1030
        SourcePosition pos_;
dvander@195
  1031
        Expression *type_;
dvander@146
  1032
        ScopedRoot<String> name_;
dvander@146
  1033
dvander@146
  1034
      public:
dvander@146
  1035
        Field(const SourcePosition &pos,
dvander@195
  1036
              Expression *type,
dvander@195
  1037
              Handle<String> name)
dvander@146
  1038
          : pos_(pos),
dvander@146
  1039
            type_(type),
dvander@195
  1040
            name_(name)
dvander@146
  1041
        {
dvander@146
  1042
        }
dvander@146
  1043
dvander@146
  1044
        const SourcePosition &pos() const {
dvander@146
  1045
            return pos_;
dvander@146
  1046
        }
dvander@195
  1047
        Handle<String> name() const {
dvander@146
  1048
            return name_;
dvander@146
  1049
        }
dvander@195
  1050
        Expression *type() const {
dvander@195
  1051
            return type_;
dvander@146
  1052
        }
dvander@146
  1053
    };
dvander@146
  1054
dvander@146
  1055
    typedef PoolList<StructureStatement::Field *> FieldList;
dvander@146
  1056
dvander@146
  1057
  public:
dvander@195
  1058
    StructureStatement(const SourcePosition &pos, Handle<String> name, FieldList *fields)
dvander@146
  1059
      : Statement(pos),
dvander@195
  1060
        name_(name),
dvander@195
  1061
        fields_(fields),
dvander@195
  1062
        sym_(NULL)
dvander@146
  1063
    {
dvander@146
  1064
    }
dvander@146
  1065
dvander@195
  1066
    DECLARE_NODE(StructureStatement);
dvander@195
  1067
dvander@146
  1068
    FieldList *fields() const {
dvander@146
  1069
        return fields_;
dvander@146
  1070
    }
dvander@195
  1071
    Handle<String> name() const {
dvander@195
  1072
        return name_;
dvander@146
  1073
    }
dvander@195
  1074
    void setSymbol(TypeSymbol *sym) {
dvander@195
  1075
        assert(!sym_);
dvander@195
  1076
        sym_ = sym;
dvander@195
  1077
    }
dvander@195
  1078
    TypeSymbol *sym() const {
dvander@195
  1079
        return sym_;
dvander@146
  1080
    }
dvander@146
  1081
dvander@146
  1082
  private:
dvander@195
  1083
    ScopedRoot<String> name_;
dvander@146
  1084
    FieldList *fields_;
dvander@195
  1085
    TypeSymbol *sym_;
dvander@195
  1086
};
dvander@195
  1087
dvander@195
  1088
typedef PoolList<ScopedRoot<String> *> NameList;
dvander@195
  1089
dvander@195
  1090
class ImportStatement : public Statement
dvander@195
  1091
{
dvander@195
  1092
  public:
dvander@195
  1093
    ImportStatement(const SourcePosition &pos, NameList *names, TokenKind suffix)
dvander@195
  1094
      : Statement(pos),
dvander@195
  1095
        names_(names),
dvander@195
  1096
        suffix_(suffix),
dvander@195
  1097
        source_(NULL)
dvander@195
  1098
    {
dvander@195
  1099
    }
dvander@195
  1100
dvander@195
  1101
    DECLARE_NODE(ImportStatement);
dvander@195
  1102
dvander@195
  1103
    NameList *path() const {
dvander@195
  1104
        return names_;
dvander@195
  1105
    }
dvander@195
  1106
    void setImportSource(TranslationUnit *unit) {
dvander@195
  1107
        source_ = unit;
dvander@195
  1108
    }
dvander@195
  1109
    TranslationUnit *source() const {
dvander@195
  1110
        return source_;
dvander@195
  1111
    }
dvander@195
  1112
    TokenKind suffix() const {
dvander@195
  1113
        return suffix_;
dvander@195
  1114
    }
dvander@195
  1115
    Handle<String> name() const {
dvander@195
  1116
        assert(suffix() != TOK_STAR);
dvander@195
  1117
        return *names_->at(names_->length() - 1);
dvander@195
  1118
    }
dvander@195
  1119
dvander@195
  1120
  private:
dvander@195
  1121
    NameList *names_;
dvander@195
  1122
    TokenKind suffix_;
dvander@195
  1123
    TranslationUnit *source_;
dvander@146
  1124
};
dvander@146
  1125
dvander@146
  1126
typedef StructureStatement::FieldList FieldList;
dvander@195
  1127
typedef PoolList<NameProxy *> NameProxyList;
dvander@146
  1128
dvander@195
  1129
#undef DECLARE_NODE
dvander@0
  1130
dvander@0
  1131
class ParseTree : public PoolObject
dvander@0
  1132
{
dvander@0
  1133
    StatementList *statements_;
dvander@0
  1134
    NameProxyList *unbound_;
dvander@195
  1135
    PoolList<ImportStatement *> *imports_;
dvander@0
  1136
dvander@0
  1137
  public:
dvander@195
  1138
    ParseTree(StatementList *statements, NameProxyList *unbound, PoolList<ImportStatement *> *imports)
dvander@0
  1139
      : statements_(statements),
dvander@195
  1140
        unbound_(unbound),
dvander@195
  1141
        imports_(imports)
dvander@0
  1142
    {
dvander@0
  1143
    }
dvander@0
  1144
dvander@0
  1145
    void dump(FILE *fp);
dvander@0
  1146
dvander@0
  1147
    StatementList *statements() const {
dvander@0
  1148
        return statements_;
dvander@0
  1149
    }
dvander@0
  1150
    NameProxyList *unbound() const {
dvander@0
  1151
        return unbound_;
dvander@0
  1152
    }
dvander@195
  1153
    PoolList<ImportStatement *> *imports() const {
dvander@195
  1154
        return imports_;
dvander@195
  1155
    }
dvander@0
  1156
};
dvander@0
  1157
dvander@0
  1158
}
dvander@0
  1159
dvander@168
  1160
#endif // _include_sourcepawn_ast_h_