Differences From Artifact [73653a45c2c5d30a]:
- File
polemy/ast.d
- 2010-11-21 14:24:33 - part of checkin [3995a5eb6a] on branch trunk - added iikagen pattern match (user: kinaba) [annotate]
To Artifact [cf8f245149fce4dc]:
- File
polemy/ast.d
- 2010-11-23 07:42:13 - part of checkin [6ac127ddd0] on branch trunk - new evaluator (user: kinaba) [annotate]
14 { 14 {
15 LexPosition pos; 15 LexPosition pos;
16 mixin SimpleConstructor; 16 mixin SimpleConstructor;
17 mixin SimplePatternMatch; 17 mixin SimplePatternMatch;
18 } 18 }
19 19
20 /// 20 ///
21 class IntLiteral : AST | 21 class Int : AST
22 { 22 {
23 BigInt data; 23 BigInt data;
24 mixin SimpleClass; 24 mixin SimpleClass;
25 this(LexPosition pos, int n) {super(pos); data = n;} 25 this(LexPosition pos, int n) {super(pos); data = n;}
26 this(LexPosition pos, long n) {super(pos); data = n;} 26 this(LexPosition pos, long n) {super(pos); data = n;}
27 this(LexPosition pos, BigInt n) {super(pos); data = n;} 27 this(LexPosition pos, BigInt n) {super(pos); data = n;}
28 this(LexPosition pos, string n) {super(pos); data = BigInt(n);} 28 this(LexPosition pos, string n) {super(pos); data = BigInt(n);}
29 } 29 }
30 30
31 /// 31 ///
32 class StrLiteral : AST | 32 class Str : AST
33 { 33 {
34 string data; 34 string data;
35 mixin SimpleClass; 35 mixin SimpleClass;
36 } 36 }
37 37
38 /// 38 ///
39 class VarExpression : AST | 39 class Var : AST
40 { 40 {
41 string name; 41 string name;
42 mixin SimpleClass; 42 mixin SimpleClass;
43 } 43 }
44 44
45 /// 45 ///
46 class LayExpression : AST | 46 class Lay : AST
47 { 47 {
48 Layer layer; 48 Layer layer;
49 AST expr; 49 AST expr;
50 mixin SimpleClass; 50 mixin SimpleClass;
51 } 51 }
52 52
53 /// 53 ///
54 class LetExpression : AST | 54 class Let : AST
55 { 55 {
56 string name; 56 string name;
57 Layer layer; 57 Layer layer;
58 AST init; 58 AST init;
59 AST expr; 59 AST expr;
60 mixin SimpleClass; 60 mixin SimpleClass;
61 } 61 }
62 62
63 /// 63 ///
64 class FuncallExpression : AST | 64 class App : AST
65 { 65 {
66 AST fun; 66 AST fun;
67 AST[] args; 67 AST[] args;
68 this(LexPosition pos, AST fun, AST[] args...) 68 this(LexPosition pos, AST fun, AST[] args...)
69 { super(pos); this.fun=fun; this.args=args.dup; } 69 { super(pos); this.fun=fun; this.args=args.dup; }
70 mixin SimpleClass; 70 mixin SimpleClass;
71 } 71 }
................................................................................................................................................................................
75 { 75 {
76 string name; 76 string name;
77 Layer[] layers; 77 Layer[] layers;
78 mixin SimpleClass; 78 mixin SimpleClass;
79 } 79 }
80 80
81 /// 81 ///
82 class FunLiteral : AST | 82 class Fun : AST
83 { 83 {
84 Parameter[] params; 84 Parameter[] params;
85 AST funbody; 85 AST funbody;
86 mixin SimpleClass; 86 mixin SimpleClass;
87 } 87 }
88 88
89 /// Handy Generator for AST nodes. To use this, mixin EasyAst; 89 /// Handy Generator for AST nodes. To use this, mixin EasyAst;
................................................................................................................................................................................
91 /*mixin*/ 91 /*mixin*/
92 template EasyAST() 92 template EasyAST()
93 { 93 {
94 /// 94 ///
95 template genEast(T) 95 template genEast(T)
96 { T genEast(P...)(P ps) { return new T(LexPosition.dummy, ps); } 96 { T genEast(P...)(P ps) { return new T(LexPosition.dummy, ps); }
97 97
98 alias genEast!StrLiteral strl; /// | 98 alias genEast!Str strl; ///
99 alias genEast!IntLiteral intl; /// | 99 alias genEast!Int intl; ///
100 auto fun(string[] xs, AST ps) { 100 auto fun(string[] xs, AST ps) {
101 return genEast!FunLiteral(array(map!((string x){return new Param | 101 return genEast!Fun(array(map!((string x){return new Parameter(x,
102 auto funp(Parameter[] xs, AST ps) { return genEast!FunLiteral(xs,ps); } | 102 auto funp(Parameter[] xs, AST ps) { return genEast!Fun(xs,ps); } ///
103 alias genEast!VarExpression var; /// | 103 alias genEast!Var var; ///
104 alias genEast!LayExpression lay; /// | 104 alias genEast!Lay lay; ///
105 alias genEast!LetExpression let; /// | 105 alias genEast!Let let; ///
106 alias genEast!FuncallExpression call; /// | 106 alias genEast!App call; ///
107 auto param(string name, string[] lay...) { return new Parameter(name, la 107 auto param(string name, string[] lay...) { return new Parameter(name, la
108 } 108 }