Differences From Artifact [9b22488b3393157f]:
- File        
polemy/ast.d
- 2010-11-08 11:57:48 - part of checkin [077506b38c] on branch trunk - Generic toString utility added. (user: kinaba) [annotate]
 
To Artifact [f03af1208bc8c434]:
- File        
polemy/ast.d
- 2010-11-08 12:26:39 - part of checkin [80ff567c75] on branch trunk - Testing easyAST. (user: kinaba) [annotate]
 
    2   * Authors: k.inaba                                                                    2   * Authors: k.inaba
    3   * License: NYSL 0.9982 http://www.kmonos.net/nysl/                                    3   * License: NYSL 0.9982 http://www.kmonos.net/nysl/
    4   *                                                                                     4   *
    5   * Syntax tree for Polemy programming language.                                        5   * Syntax tree for Polemy programming language.
    6   */                                                                                    6   */
    7  module polemy.ast;                                                                     7  module polemy.ast;
    8  import polemy._common;                                                                 8  import polemy._common;
    9  import polemy.lex : LexPosition;                                                 |     9  import polemy.lex;
   10                                                                                        10  
   11  alias Statement[] Program;                                                            11  alias Statement[] Program;
   12                                                                                        12  
   13  abstract class Statement                                                              13  abstract class Statement
   14  {                                                                                     14  {
   15          immutable LexPosition pos;                                                    15          immutable LexPosition pos;
   16          mixin SimpleConstructor;                                                      16          mixin SimpleConstructor;
   17  }                                                                                     17  }
   18                                                                                        18  
   19  class DeclStatement : Statement                                                       19  class DeclStatement : Statement
   20  {                                                                                     20  {
   21          string     var;                                                               21          string     var;
   22          Expression expr;                                                              22          Expression expr;
   23          mixin SimpleConstructor;                                                 <
   24          mixin SimpleCompare;                                                     |    23          mixin SimpleClass;
   25  }                                                                                     24  }
   26                                                                                        25  
   27  class ExprStatement : Statement                                                       26  class ExprStatement : Statement
   28  {                                                                                     27  {
   29          Expression expr;                                                              28          Expression expr;
   30          mixin SimpleConstructor;                                                 <
   31          mixin SimpleCompare;                                                     |    29          mixin SimpleClass;
   32  }                                                                                     30  }
   33                                                                                        31  
   34  abstract class Expression                                                             32  abstract class Expression
   35  {                                                                                     33  {
   36          immutable LexPosition pos;                                                    34          immutable LexPosition pos;
   37          mixin SimpleConstructor;                                                      35          mixin SimpleConstructor;
   38          mixin SimpleCompare;                                                     <
   39  }                                                                                     36  }
   40                                                                                        37  
   41  class StrLiteralExpression : Expression                                               38  class StrLiteralExpression : Expression
   42  {                                                                                     39  {
   43          string data;                                                                  40          string data;
   44          mixin SimpleConstructor;                                                 <
   45          mixin SimpleCompare;                                                     |    41          mixin SimpleClass;
   46  }                                                                                     42  }
   47                                                                                        43  
   48  class IntLiteralExpression : Expression                                               44  class IntLiteralExpression : Expression
   49  {                                                                                     45  {
   50          BigInt data;                                                                  46          BigInt data;
   51          mixin SimpleConstructor;                                                 <
   52          mixin SimpleCompare;                                                     |    47          mixin SimpleClass;
   53  }                                                                                     48  }
   54                                                                                        49  
   55  class VarExpression : Expression                                                      50  class VarExpression : Expression
   56  {                                                                                     51  {
   57          string var;                                                                   52          string var;
   58          mixin SimpleConstructor;                                                 <
   59          mixin SimpleCompare;                                                     |    53          mixin SimpleClass;
   60  }                                                                                     54  }
   61                                                                                        55  
   62  class AssignExpression : Expression                                                   56  class AssignExpression : Expression
   63  {                                                                                     57  {
   64          Expression lhs;                                                               58          Expression lhs;
   65          Expression rhs;                                                               59          Expression rhs;
   66          mixin SimpleConstructor;                                                 <
   67          mixin SimpleCompare;                                                     |    60          mixin SimpleClass;
   68  }                                                                                     61  }
   69                                                                                        62  
   70  class FuncallExpression : Expression                                                  63  class FuncallExpression : Expression
   71  {                                                                                     64  {
   72          Expression   fun;                                                             65          Expression   fun;
   73          Expression[] args;                                                            66          Expression[] args;
   74          this(immutable LexPosition pos, Expression fun, Expression[] args...)         67          this(immutable LexPosition pos, Expression fun, Expression[] args...)
   75                  { super(pos); this.fun=fun; this.args=args.dup; }                     68                  { super(pos); this.fun=fun; this.args=args.dup; }
   76          mixin SimpleCompare;                                                     |    69          mixin SimpleClass;
   77  }                                                                                     70  }
   78                                                                                        71  
   79  class FunLiteralExpression : Expression                                               72  class FunLiteralExpression : Expression
   80  {                                                                                     73  {
   81          string[] params;                                                              74          string[] params;
   82          Program  funbody;                                                             75          Program  funbody;
   83          mixin SimpleConstructor;                                                 |    76          mixin SimpleClass;
                                                                                        >    77  }
                                                                                        >    78  
                                                                                        >    79  /// Handy Generator for AST nodes. To use this, mixin EasyAst;
                                                                                        >    80  
   84          mixin SimpleCompare;                                                     |    81  /*mixin*/
                                                                                        >    82  template EasyAst()
                                                                                        >    83  {
                                                                                        >    84          template genEast(T)
                                                                                        >    85                  { T genEast(P...)(P ps) { return new T(LexPosition.dummy, ps); }
                                                                                        >    86  
                                                                                        >    87          alias genEast!DeclStatement decl;
                                                                                        >    88          alias genEast!ExprStatement expr;
                                                                                        >    89          alias genEast!VarExpression var;
                                                                                        >    90          alias genEast!FuncallExpression funcall;
                                                                                        >    91          alias genEast!IntLiteralExpression intl;
                                                                                        >    92          alias genEast!StrLiteralExpression strl;
                                                                                        >    93          alias genEast!FunLiteralExpression fun;
   85  }                                                                                     94  }