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 }