@@ -5,10 +5,10 @@ * Syntax tree for Polemy programming language. */ module polemy.ast; import polemy._common; -import polemy.lex : LexPosition; - +import polemy.lex; + alias Statement[] Program; abstract class Statement { @@ -19,53 +19,46 @@ class DeclStatement : Statement { string var; Expression expr; - mixin SimpleConstructor; - mixin SimpleCompare; + mixin SimpleClass; } class ExprStatement : Statement { Expression expr; - mixin SimpleConstructor; - mixin SimpleCompare; + mixin SimpleClass; } abstract class Expression { immutable LexPosition pos; mixin SimpleConstructor; - mixin SimpleCompare; } class StrLiteralExpression : Expression { string data; - mixin SimpleConstructor; - mixin SimpleCompare; + mixin SimpleClass; } class IntLiteralExpression : Expression { BigInt data; - mixin SimpleConstructor; - mixin SimpleCompare; + mixin SimpleClass; } class VarExpression : Expression { string var; - mixin SimpleConstructor; - mixin SimpleCompare; + mixin SimpleClass; } class AssignExpression : Expression { Expression lhs; Expression rhs; - mixin SimpleConstructor; - mixin SimpleCompare; + mixin SimpleClass; } class FuncallExpression : Expression { @@ -72,14 +65,30 @@ Expression fun; Expression[] args; this(immutable LexPosition pos, Expression fun, Expression[] args...) { super(pos); this.fun=fun; this.args=args.dup; } - mixin SimpleCompare; + mixin SimpleClass; } class FunLiteralExpression : Expression { string[] params; - Program funbody; - mixin SimpleConstructor; - mixin SimpleCompare; + Program funbody; + mixin SimpleClass; } + +/// Handy Generator for AST nodes. To use this, mixin EasyAst; + +/*mixin*/ +template EasyAst() +{ + template genEast(T) + { T genEast(P...)(P ps) { return new T(LexPosition.dummy, ps); } } + + alias genEast!DeclStatement decl; + alias genEast!ExprStatement expr; + alias genEast!VarExpression var; + alias genEast!FuncallExpression funcall; + alias genEast!IntLiteralExpression intl; + alias genEast!StrLiteralExpression strl; + alias genEast!FunLiteralExpression fun; +}