Artifact Content
Not logged in

Artifact f03af1208bc8c4340244f99c7e3f6f054dc2fcc5


     1  /**
     2   * Authors: k.inaba
     3   * License: NYSL 0.9982 http://www.kmonos.net/nysl/
     4   *
     5   * Syntax tree for Polemy programming language.
     6   */
     7  module polemy.ast;
     8  import polemy._common;
     9  import polemy.lex;
    10  
    11  alias Statement[] Program;
    12  
    13  abstract class Statement
    14  {
    15  	immutable LexPosition pos;
    16  	mixin SimpleConstructor;
    17  }
    18  
    19  class DeclStatement : Statement
    20  {
    21  	string     var;
    22  	Expression expr;
    23  	mixin SimpleClass;
    24  }
    25  
    26  class ExprStatement : Statement
    27  {
    28  	Expression expr;
    29  	mixin SimpleClass;
    30  }
    31  
    32  abstract class Expression
    33  {
    34  	immutable LexPosition pos;
    35  	mixin SimpleConstructor;
    36  }
    37  
    38  class StrLiteralExpression : Expression
    39  {
    40  	string data;
    41  	mixin SimpleClass;
    42  }
    43  
    44  class IntLiteralExpression : Expression
    45  {
    46  	BigInt data;
    47  	mixin SimpleClass;
    48  }
    49  
    50  class VarExpression : Expression
    51  {
    52  	string var;
    53  	mixin SimpleClass;
    54  }
    55  
    56  class AssignExpression : Expression
    57  {
    58  	Expression lhs;
    59  	Expression rhs;
    60  	mixin SimpleClass;
    61  }
    62  
    63  class FuncallExpression : Expression
    64  {
    65  	Expression   fun;
    66  	Expression[] args;
    67  	this(immutable LexPosition pos, Expression fun, Expression[] args...)
    68  		{ super(pos); this.fun=fun; this.args=args.dup; }
    69  	mixin SimpleClass;
    70  }
    71  
    72  class FunLiteralExpression : Expression
    73  {
    74  	string[] params;
    75  	Program  funbody;
    76  	mixin SimpleClass;
    77  }
    78  
    79  /// Handy Generator for AST nodes. To use this, mixin EasyAst;
    80  
    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;
    94  }