jitcraft/AST.h
author David Anderson <dvander@alliedmods.net>
Wed Jun 27 02:21:56 2012 -0700 (2012-06-27)
changeset 4 633176823669
parent 2 46fc53b8fd2f
child 9 73781c5a59d7
permissions -rw-r--r--
Add support for float variables and basic math.
dvander@0
     1
/*
dvander@0
     2
 * Copyright (C) 2012 David Anderson
dvander@0
     3
 *
dvander@0
     4
 * This file is part of JITCraft.
dvander@0
     5
 *
dvander@0
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     7
 * the terms of the GNU General Public License as published by the Free
dvander@0
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
     9
 * any later version.
dvander@0
    10
 * 
dvander@0
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    14
 *
dvander@0
    15
 * You should have received a copy of the GNU General Public License along with
dvander@0
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    17
 */
dvander@0
    18
#ifndef _include_jitcraft_ast_h_
dvander@0
    19
#define _include_jitcraft_ast_h_
dvander@0
    20
dvander@0
    21
#include "PoolAllocator.h"
dvander@0
    22
#include "Token.h"
dvander@0
    23
#include "StringPool.h"
dvander@0
    24
#include "NameBinding.h"
dvander@0
    25
dvander@0
    26
namespace jc {
dvander@0
    27
dvander@0
    28
#define ASTKINDS(_)             \
dvander@0
    29
    _(VariableDeclaration)      \
dvander@0
    30
    _(ForStatement)             \
dvander@0
    31
    _(ReturnStatement)          \
dvander@4
    32
    _(IntegerLiteral)           \
dvander@4
    33
    _(FloatLiteral)             \
dvander@0
    34
    _(BinaryExpression)         \
dvander@0
    35
    _(BlockStatement)           \
dvander@0
    36
    _(Assignment)               \
dvander@0
    37
    _(NameProxy)                \
dvander@0
    38
    _(ExpressionStatement)      \
dvander@0
    39
    _(FunctionStatement)        \
dvander@0
    40
    _(CallExpression)           \
dvander@0
    41
    _(IfStatement)              \
dvander@2
    42
    _(IndexExpression)          \
dvander@2
    43
    _(EnumStatement)
dvander@0
    44
dvander@0
    45
// Forward declarations.
dvander@0
    46
#define _(name) class name;
dvander@0
    47
ASTKINDS(_)
dvander@0
    48
#undef _
dvander@0
    49
dvander@0
    50
class AstVisitor;
dvander@0
    51
dvander@0
    52
// Interface for AST nodes.
dvander@0
    53
class AstNode : public PoolObject
dvander@0
    54
{
dvander@0
    55
  public:
dvander@0
    56
    enum Kind {
dvander@0
    57
#       define _(name) k##name,
dvander@0
    58
        ASTKINDS(_)
dvander@0
    59
#       undef _
dvander@0
    60
        AstKind_Invalid
dvander@0
    61
    };
dvander@0
    62
    
dvander@0
    63
    virtual Kind kind() const = 0;
dvander@0
    64
dvander@0
    65
#define _(name)     bool is##name() { return kind() == k##name; }                   \
dvander@0
    66
                    name *to##name() { assert(is##name()); return (name *)this; }
dvander@0
    67
    ASTKINDS(_)
dvander@0
    68
#undef _
dvander@0
    69
dvander@0
    70
    virtual void accept(AstVisitor *visitor) = 0;
dvander@0
    71
};
dvander@0
    72
dvander@0
    73
class AstVisitor
dvander@0
    74
{
dvander@0
    75
  public:
dvander@0
    76
#define _(name) virtual void visit(name *node) = 0;
dvander@0
    77
    ASTKINDS(_)
dvander@0
    78
#undef _
dvander@0
    79
};
dvander@0
    80
dvander@0
    81
class NameLocation
dvander@0
    82
{
dvander@0
    83
  public:
dvander@0
    84
    enum Kind {
dvander@0
    85
        LOCAL
dvander@0
    86
    };
dvander@0
    87
dvander@0
    88
    static NameLocation Local(VariableDeclaration *decl) {
dvander@0
    89
        NameLocation loc;
dvander@0
    90
        loc.kind_ = LOCAL;
dvander@0
    91
        loc.u_.decl = decl;
dvander@0
    92
        return loc;
dvander@0
    93
    }
dvander@0
    94
dvander@0
    95
    Kind kind() const {
dvander@0
    96
        return kind_;
dvander@0
    97
    }
dvander@0
    98
dvander@0
    99
    VariableDeclaration *local() const {
dvander@0
   100
        assert(kind() == LOCAL);
dvander@0
   101
        return u_.decl;
dvander@0
   102
    }
dvander@0
   103
dvander@0
   104
  private:
dvander@0
   105
    Kind kind_;
dvander@0
   106
    union {
dvander@0
   107
        VariableDeclaration *decl;
dvander@0
   108
    } u_;
dvander@0
   109
};
dvander@0
   110
dvander@0
   111
class Statement : public AstNode
dvander@0
   112
{
dvander@0
   113
};
dvander@0
   114
dvander@0
   115
class Expression : public AstNode
dvander@0
   116
{
dvander@0
   117
    Type *type_;
dvander@0
   118
dvander@0
   119
  public:
dvander@0
   120
    Expression()
dvander@0
   121
      : type_(NULL)
dvander@0
   122
    {
dvander@0
   123
    }
dvander@0
   124
dvander@0
   125
    void setType(Type *type) {
dvander@0
   126
        type_ = type;
dvander@0
   127
    }
dvander@0
   128
    Type *type() const {
dvander@0
   129
        return type_;
dvander@0
   130
    }
dvander@0
   131
};
dvander@0
   132
dvander@0
   133
class Declaration : public Statement
dvander@0
   134
{
dvander@0
   135
};
dvander@0
   136
dvander@0
   137
typedef PoolList<Statement *> StatementList;
dvander@0
   138
typedef std::vector<Expression *> ExpressionList;
dvander@0
   139
dvander@0
   140
class VariableDeclaration : public Declaration
dvander@0
   141
{
dvander@0
   142
    Variable *variable_;
dvander@0
   143
    Expression *initialization_;
dvander@0
   144
    ExpressionList *postDimensions_;
dvander@4
   145
    Name *tag_;
dvander@0
   146
dvander@0
   147
  public:
dvander@4
   148
    VariableDeclaration(Variable *var, Name *tag, ExpressionList *postDimensions, Expression *initialization)
dvander@0
   149
      : variable_(var),
dvander@0
   150
        postDimensions_(postDimensions),
dvander@4
   151
        initialization_(initialization),
dvander@4
   152
        tag_(tag)
dvander@0
   153
    {
dvander@0
   154
    }
dvander@0
   155
dvander@4
   156
    Name *tag() const {
dvander@4
   157
        return tag_;
dvander@4
   158
    }
dvander@0
   159
    Kind kind() const {
dvander@0
   160
        return kVariableDeclaration;
dvander@0
   161
    }
dvander@0
   162
    Variable *variable() const {
dvander@0
   163
        return variable_;
dvander@0
   164
    }
dvander@0
   165
    Expression *initialization() const {
dvander@0
   166
        return initialization_;
dvander@0
   167
    }
dvander@0
   168
    ExpressionList *postDimensions() const {
dvander@0
   169
        return postDimensions_;
dvander@0
   170
    }
dvander@0
   171
    void accept(AstVisitor *visitor) {
dvander@0
   172
        visitor->visit(this);
dvander@0
   173
    }
dvander@0
   174
};
dvander@0
   175
dvander@0
   176
class NameProxy : public Expression
dvander@0
   177
{
dvander@0
   178
    Name *name_;
dvander@0
   179
    BoundName *binding_;
dvander@0
   180
dvander@0
   181
  public:
dvander@0
   182
    NameProxy(Name *name, BoundName *binding)
dvander@0
   183
      : name_(name),
dvander@0
   184
        binding_(binding)
dvander@0
   185
    {
dvander@0
   186
    }
dvander@0
   187
dvander@0
   188
    Kind kind() const {
dvander@0
   189
        return kNameProxy;
dvander@0
   190
    }
dvander@0
   191
    Name *name() const {
dvander@0
   192
        return name_;
dvander@0
   193
    }
dvander@0
   194
    void accept(AstVisitor *visitor) {
dvander@0
   195
        visitor->visit(this);
dvander@0
   196
    }
dvander@0
   197
    BoundName *binding() const {
dvander@0
   198
        return binding_;
dvander@0
   199
    }
dvander@0
   200
    void bind(BoundName *name) {
dvander@0
   201
        assert(!binding());
dvander@0
   202
        binding_ = name;
dvander@0
   203
    }
dvander@0
   204
};
dvander@0
   205
dvander@4
   206
class IntegerLiteral : public Expression
dvander@0
   207
{
dvander@0
   208
    int value_;
dvander@0
   209
dvander@0
   210
  public:
dvander@4
   211
    IntegerLiteral(int value)
dvander@0
   212
      : value_(value)
dvander@0
   213
    {
dvander@0
   214
    }
dvander@0
   215
dvander@0
   216
    Kind kind() const {
dvander@4
   217
        return kIntegerLiteral;
dvander@0
   218
    }
dvander@0
   219
    int value() const {
dvander@0
   220
        return value_;
dvander@0
   221
    }
dvander@0
   222
    void accept(AstVisitor *visitor) {
dvander@0
   223
        visitor->visit(this);
dvander@0
   224
    }
dvander@0
   225
};
dvander@0
   226
dvander@4
   227
class FloatLiteral : public Expression
dvander@4
   228
{
dvander@4
   229
    double value_;
dvander@4
   230
dvander@4
   231
  public:
dvander@4
   232
    FloatLiteral(double value)
dvander@4
   233
      : value_(value)
dvander@4
   234
    {
dvander@4
   235
    }
dvander@4
   236
dvander@4
   237
    Kind kind() const {
dvander@4
   238
        return kFloatLiteral;
dvander@4
   239
    }
dvander@4
   240
    double value() const {
dvander@4
   241
        return value_;
dvander@4
   242
    }
dvander@4
   243
    void accept(AstVisitor *visitor) {
dvander@4
   244
        visitor->visit(this);
dvander@4
   245
    }
dvander@4
   246
};
dvander@4
   247
dvander@0
   248
class BinaryExpression : public Expression
dvander@0
   249
{
dvander@0
   250
    Expression *left_;
dvander@0
   251
    Expression *right_;
dvander@0
   252
    TokenKind token_;
dvander@0
   253
dvander@0
   254
  public:
dvander@0
   255
    BinaryExpression(TokenKind token, Expression *left, Expression *right)
dvander@0
   256
      : token_(token),
dvander@0
   257
        left_(left),
dvander@0
   258
        right_(right)
dvander@0
   259
    {
dvander@0
   260
    }
dvander@0
   261
dvander@0
   262
    Kind kind() const {
dvander@0
   263
        return kBinaryExpression;
dvander@0
   264
    }
dvander@0
   265
    Expression *left() const {
dvander@0
   266
        return left_;
dvander@0
   267
    }
dvander@0
   268
    Expression *right() const {
dvander@0
   269
        return right_;
dvander@0
   270
    }
dvander@0
   271
    TokenKind token() const {
dvander@0
   272
        return token_;
dvander@0
   273
    }
dvander@0
   274
    void accept(AstVisitor *visitor) {
dvander@0
   275
        visitor->visit(this);
dvander@0
   276
    }
dvander@0
   277
};
dvander@0
   278
dvander@0
   279
class IndexExpression : public Expression
dvander@0
   280
{
dvander@0
   281
    Expression *left_;
dvander@0
   282
    Expression *right_;
dvander@0
   283
dvander@0
   284
  public:
dvander@0
   285
    IndexExpression(Expression *left, Expression *right)
dvander@0
   286
      : left_(left),
dvander@0
   287
        right_(right)
dvander@0
   288
    {
dvander@0
   289
    }
dvander@0
   290
dvander@0
   291
    Kind kind() const {
dvander@0
   292
        return kIndexExpression;
dvander@0
   293
    }
dvander@0
   294
    Expression *left() const {
dvander@0
   295
        return left_;
dvander@0
   296
    }
dvander@0
   297
    Expression *right() const {
dvander@0
   298
        return right_;
dvander@0
   299
    }
dvander@0
   300
    void accept(AstVisitor *visitor) {
dvander@0
   301
        visitor->visit(this);
dvander@0
   302
    }
dvander@0
   303
};
dvander@0
   304
dvander@0
   305
class CallExpression : public Expression
dvander@0
   306
{
dvander@0
   307
    Expression *callee_;
dvander@0
   308
    ExpressionList *arguments_;
dvander@0
   309
dvander@0
   310
  public:
dvander@0
   311
    CallExpression(Expression *callee, ExpressionList *arguments)
dvander@0
   312
      : callee_(callee),
dvander@0
   313
        arguments_(arguments)
dvander@0
   314
    {
dvander@0
   315
    }
dvander@0
   316
dvander@0
   317
    Kind kind() const {
dvander@0
   318
        return kCallExpression;
dvander@0
   319
    }
dvander@0
   320
    Expression *callee() const {
dvander@0
   321
        return callee_;
dvander@0
   322
    }
dvander@0
   323
    ExpressionList *arguments() const {
dvander@0
   324
        return arguments_;
dvander@0
   325
    }
dvander@0
   326
    void accept(AstVisitor *visitor) {
dvander@0
   327
        visitor->visit(this);
dvander@0
   328
    }
dvander@0
   329
};
dvander@0
   330
dvander@0
   331
class ForStatement : public Statement
dvander@0
   332
{
dvander@0
   333
    Scope *scope_;
dvander@0
   334
    VariableDeclaration *declaration_;
dvander@0
   335
    Expression *condition_;
dvander@0
   336
    Statement *update_;
dvander@0
   337
    Statement *body_;
dvander@0
   338
dvander@0
   339
  public:
dvander@0
   340
    ForStatement(Scope *scope, VariableDeclaration *declaration,
dvander@0
   341
                 Expression *condition, Statement *update, Statement *body)
dvander@0
   342
      : scope_(scope),
dvander@0
   343
        declaration_(declaration),
dvander@0
   344
        condition_(condition),
dvander@0
   345
        update_(update),
dvander@0
   346
        body_(body)
dvander@0
   347
    {
dvander@0
   348
    }
dvander@0
   349
dvander@0
   350
    Kind kind() const {
dvander@0
   351
        return kForStatement;
dvander@0
   352
    }
dvander@0
   353
    VariableDeclaration *declaration() const {
dvander@0
   354
        return declaration_;
dvander@0
   355
    }
dvander@0
   356
    Scope *scope() const {
dvander@0
   357
        return scope_;
dvander@0
   358
    }
dvander@0
   359
    Expression *condition() const {
dvander@0
   360
        return condition_;
dvander@0
   361
    }
dvander@0
   362
    Statement *update() const {
dvander@0
   363
        return update_;
dvander@0
   364
    }
dvander@0
   365
    Statement *body() const {
dvander@0
   366
        return body_;
dvander@0
   367
    }
dvander@0
   368
    void accept(AstVisitor *visitor) {
dvander@0
   369
        visitor->visit(this);
dvander@0
   370
    }
dvander@0
   371
};
dvander@0
   372
dvander@0
   373
class ReturnStatement : public Statement
dvander@0
   374
{
dvander@0
   375
    Expression *expression_;
dvander@0
   376
dvander@0
   377
  public:
dvander@0
   378
    ReturnStatement(Expression *expression)
dvander@0
   379
      : expression_(expression)
dvander@0
   380
    {
dvander@0
   381
    }
dvander@0
   382
dvander@0
   383
    Kind kind() const {
dvander@0
   384
        return kReturnStatement;
dvander@0
   385
    }
dvander@0
   386
    Expression *expression() const {
dvander@0
   387
        return expression_;
dvander@0
   388
    }
dvander@0
   389
    void accept(AstVisitor *visitor) {
dvander@0
   390
        visitor->visit(this);
dvander@0
   391
    }
dvander@0
   392
};
dvander@0
   393
dvander@0
   394
class Assignment : public Expression
dvander@0
   395
{
dvander@0
   396
    Expression *lvalue_;
dvander@0
   397
    Expression *expression_;
dvander@0
   398
dvander@0
   399
  public:
dvander@0
   400
    Assignment(Expression *left, Expression *right)
dvander@0
   401
      : lvalue_(left),
dvander@0
   402
        expression_(right)
dvander@0
   403
    {
dvander@0
   404
    }
dvander@0
   405
dvander@0
   406
    Kind kind() const {
dvander@0
   407
        return kAssignment;
dvander@0
   408
    }
dvander@0
   409
    Expression *lvalue() const {
dvander@0
   410
        return lvalue_;
dvander@0
   411
    }
dvander@0
   412
    Expression *expression() const {
dvander@0
   413
        return expression_;
dvander@0
   414
    }
dvander@0
   415
    void accept(AstVisitor *visitor) {
dvander@0
   416
        visitor->visit(this);
dvander@0
   417
    }
dvander@0
   418
};
dvander@0
   419
dvander@0
   420
class ExpressionStatement : public Statement
dvander@0
   421
{
dvander@0
   422
    Expression *expression_;
dvander@0
   423
dvander@0
   424
  public:
dvander@0
   425
    ExpressionStatement(Expression *expression)
dvander@0
   426
      : expression_(expression)
dvander@0
   427
    {
dvander@0
   428
    }
dvander@0
   429
dvander@0
   430
    Kind kind() const {
dvander@0
   431
        return kExpressionStatement;
dvander@0
   432
    }
dvander@0
   433
    Expression *expression() const {
dvander@0
   434
        return expression_;
dvander@0
   435
    }
dvander@0
   436
    void accept(AstVisitor *visitor) {
dvander@0
   437
        visitor->visit(this);
dvander@0
   438
    }
dvander@0
   439
};
dvander@0
   440
dvander@0
   441
class BlockStatement : public Statement
dvander@0
   442
{
dvander@0
   443
    Scope *scope_;
dvander@0
   444
    StatementList *statements_;
dvander@0
   445
dvander@0
   446
  public:
dvander@0
   447
    BlockStatement(Scope *scope, StatementList *statements)
dvander@0
   448
      : scope_(scope),
dvander@0
   449
        statements_(statements)
dvander@0
   450
    {
dvander@0
   451
    }
dvander@0
   452
dvander@0
   453
    Kind kind() const {
dvander@0
   454
        return kBlockStatement;
dvander@0
   455
    }
dvander@0
   456
    Scope *scope() const {
dvander@0
   457
        return scope_;
dvander@0
   458
    }
dvander@0
   459
    StatementList *statements() const {
dvander@0
   460
        return statements_;
dvander@0
   461
    }
dvander@0
   462
    void accept(AstVisitor *visitor) {
dvander@0
   463
        visitor->visit(this);
dvander@0
   464
    }
dvander@0
   465
};
dvander@0
   466
dvander@0
   467
class FunctionStatement : public Statement
dvander@0
   468
{
dvander@0
   469
    Scope *scope_;
dvander@0
   470
    NamedFunction *fun_;
dvander@0
   471
    Statement *body_;
dvander@0
   472
dvander@0
   473
  public:
dvander@0
   474
    FunctionStatement(Scope *scope, NamedFunction *fun, Statement *body)
dvander@0
   475
      : scope_(scope),
dvander@0
   476
        fun_(fun),
dvander@0
   477
        body_(body)
dvander@0
   478
    {
dvander@0
   479
    }
dvander@0
   480
dvander@0
   481
    Kind kind() const {
dvander@0
   482
        return kFunctionStatement;
dvander@0
   483
    }
dvander@0
   484
    Scope *scope() const {
dvander@0
   485
        return scope_;
dvander@0
   486
    }
dvander@0
   487
    NamedFunction *fun() const {
dvander@0
   488
        return fun_;
dvander@0
   489
    }
dvander@0
   490
    Statement *body() const {
dvander@0
   491
        return body_;
dvander@0
   492
    }
dvander@0
   493
    void accept(AstVisitor *visitor) {
dvander@0
   494
        visitor->visit(this);
dvander@0
   495
    }
dvander@0
   496
};
dvander@0
   497
dvander@0
   498
class IfStatement : public Statement
dvander@0
   499
{
dvander@0
   500
    Expression *condition_;
dvander@0
   501
    Statement *ifTrue_;
dvander@0
   502
    Statement *ifFalse_;
dvander@0
   503
dvander@0
   504
  public:
dvander@0
   505
    IfStatement(Expression *condition, Statement *ifTrue)
dvander@0
   506
      : condition_(condition),
dvander@0
   507
        ifTrue_(ifTrue),
dvander@0
   508
        ifFalse_(NULL)
dvander@0
   509
    {
dvander@0
   510
    }
dvander@0
   511
dvander@0
   512
    Kind kind() const {
dvander@0
   513
        return kIfStatement;
dvander@0
   514
    }
dvander@0
   515
    Expression *condition() const {
dvander@0
   516
        return condition_;
dvander@0
   517
    }
dvander@0
   518
    Statement *ifTrue() const {
dvander@0
   519
        return ifTrue_;
dvander@0
   520
    }
dvander@0
   521
    Statement *ifFalse() const {
dvander@0
   522
        return ifFalse_;
dvander@0
   523
    }
dvander@0
   524
    void setIfFalse(Statement *ifFalse) {
dvander@0
   525
        ifFalse_ = ifFalse;
dvander@0
   526
    }
dvander@0
   527
    void accept(AstVisitor *visitor) {
dvander@0
   528
        visitor->visit(this);
dvander@0
   529
    }
dvander@0
   530
};
dvander@0
   531
dvander@2
   532
class EnumStatement : public Statement
dvander@2
   533
{
dvander@2
   534
    Name *name_;
dvander@2
   535
dvander@2
   536
  public:
dvander@2
   537
    struct Entry {
dvander@2
   538
        NamedConstant *name;
dvander@2
   539
        Expression *expr;
dvander@2
   540
dvander@2
   541
        Entry(NamedConstant *name, Expression *expr)
dvander@2
   542
          : name(name),
dvander@2
   543
            expr(expr)
dvander@2
   544
        {
dvander@2
   545
        }
dvander@2
   546
    };
dvander@2
   547
dvander@2
   548
    typedef std::vector<Entry> EntryList;
dvander@2
   549
dvander@2
   550
  public:
dvander@2
   551
    EnumStatement(Name *name, EntryList *entries)
dvander@2
   552
      : name_(name),
dvander@2
   553
        entries_(entries)
dvander@2
   554
    {
dvander@2
   555
    }
dvander@2
   556
dvander@2
   557
    Kind kind() const {
dvander@2
   558
        return kEnumStatement;
dvander@2
   559
    }
dvander@2
   560
    Name *name() const {
dvander@2
   561
        return name_;
dvander@2
   562
    }
dvander@2
   563
    EntryList *entries() const {
dvander@2
   564
        return entries_;
dvander@2
   565
    }
dvander@2
   566
    void accept(AstVisitor *visitor) {
dvander@2
   567
        visitor->visit(this);
dvander@2
   568
    }
dvander@2
   569
dvander@2
   570
  private:
dvander@2
   571
    EntryList *entries_;
dvander@2
   572
};
dvander@2
   573
dvander@0
   574
class Scope;
dvander@0
   575
dvander@0
   576
typedef std::vector<NameProxy *> NameProxyList;
dvander@0
   577
dvander@0
   578
class ParseTree : public PoolObject
dvander@0
   579
{
dvander@0
   580
    StatementList *statements_;
dvander@0
   581
    Scope *scope_;
dvander@0
   582
    NameProxyList *unbound_;
dvander@0
   583
dvander@0
   584
  public:
dvander@0
   585
    ParseTree(Scope *scope, StatementList *statements, NameProxyList *unbound)
dvander@0
   586
      : statements_(statements),
dvander@0
   587
        scope_(scope),
dvander@0
   588
        unbound_(unbound)
dvander@0
   589
    {
dvander@0
   590
    }
dvander@0
   591
dvander@0
   592
    void dump(FILE *fp);
dvander@0
   593
dvander@0
   594
    StatementList *statements() const {
dvander@0
   595
        return statements_;
dvander@0
   596
    }
dvander@0
   597
    Scope *scope() const {
dvander@0
   598
        return scope_;
dvander@0
   599
    }
dvander@0
   600
    NameProxyList *unbound() const {
dvander@0
   601
        return unbound_;
dvander@0
   602
    }
dvander@0
   603
};
dvander@0
   604
dvander@0
   605
}
dvander@0
   606
dvander@0
   607
#endif // _include_jitcraft_ast_h_