Artifact Content
Not logged in

Artifact b8324439b8512940d0ecba64c1dd40f491fc3f6b


/**
 * Authors: k.inaba
 * License: NYSL 0.9982 http://www.kmonos.net/nysl/
 *
 * Syntax tree for Polemy programming language.
 */
module polemy.ast;
import polemy._common;
import polemy.lex;

///
abstract class AST
{
	immutable LexPosition pos;
	mixin SimpleConstructor;
}

///
class StrLiteral : AST
{
	string data;
	mixin SimpleClass;
}

///
class IntLiteral : AST
{
	BigInt data;
	mixin SimpleClass;
	this(immutable LexPosition pos, long n) {super(pos); data = n;}
	this(immutable LexPosition pos, BigInt n) {super(pos); data = n;}
	this(immutable LexPosition pos, string n) {super(pos); data = BigInt(n);}
}

///
class VarExpression : AST
{
	string var;
	mixin SimpleClass;
}

///
class LayeredExpression : AST
{
	string lay;
	AST    expr;
	mixin SimpleClass;
}

///
class LetExpression : AST
{
	string var;
	string layer;
	AST    init;
	AST    expr;
	mixin SimpleClass;
}

///
class FuncallExpression : AST
{
	AST   fun;
	AST[] args;
	this(immutable LexPosition pos, AST fun, AST[] args...)
		{ super(pos); this.fun=fun; this.args=args.dup; }
	mixin SimpleClass;
}

///
class FunLiteral : AST
{
	string[] params;
	AST      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!StrLiteral strl; ///
	alias genEast!IntLiteral intl; ///
	auto fun(string[] xs, AST ps) { return genEast!FunLiteral(xs,ps); } ///
	alias genEast!VarExpression var; ///
	alias genEast!LayeredExpression lay; ///
	alias genEast!LetExpression let; ///
	alias genEast!FuncallExpression call; ///
}