@@ -3,6 +3,31 @@ my $T_INT := 1;
3
3
my $ T_NUM := 2 ;
4
4
my $ T_STR := 3 ;
5
5
6
+ class TAST {
7
+ has $ ! tree ;
8
+ method run () {
9
+ nqp ::runtruffle($ ! tree );
10
+ }
11
+
12
+ sub sexpr (int $ unquoted , $ thing ) {
13
+ if nqp ::islist($ thing ) {
14
+ my @ ret ;
15
+ my int $ first := 1 ;
16
+ for $ thing -> $ element {
17
+ nqp :: push (@ ret , sexpr($ first , $ element ));
18
+ $ first := 0 ;
19
+ }
20
+ ' (' ~ nqp :: join (' ' , @ ret ) ~ ' )' ;
21
+ } elsif nqp ::isstr($ thing ) {
22
+ $ unquoted ?? $ thing !! ' "' ~ nqp ::escape($ thing ) ~ ' "' ;
23
+ }
24
+ }
25
+
26
+ method dump () {
27
+ sexpr(0 , $ ! tree ) ~ " \n " ;
28
+ }
29
+ }
30
+
6
31
class QAST::OperationsTruffle {
7
32
my % ops ;
8
33
my % hll_ops ;
@@ -81,23 +106,8 @@ class QAST::OperationsTruffle {
81
106
}
82
107
83
108
class QAST::TruffleCompiler {
84
- method sexpr ($ thing ) {
85
- if nqp ::islist($ thing ) {
86
- my @ ret ;
87
- for $ thing -> $ element {
88
- nqp :: push (@ ret , self . sexpr($ element ));
89
- }
90
- ' (' ~ nqp :: join (' ' , @ ret ) ~ ' )' ;
91
- } elsif nqp ::isstr($ thing ) {
92
- $ thing ;
93
- }
94
- }
95
-
96
- method run (QAST ::CompUnit $ cu ) {
97
- my $ compiled := self . as_truffle($ cu , : want($ T_OBJ ));
98
-
99
- say (self . sexpr($ compiled ));
100
- nqp ::runtruffle($ compiled );
109
+ method compile (QAST ::CompUnit $ cu ) {
110
+ TAST. new (tree => self . as_truffle($ cu , : want($ T_OBJ )));
101
111
}
102
112
103
113
proto method as_truffle ($ node , : $ want ) {
@@ -144,12 +154,16 @@ class QAST::TruffleCompiler {
144
154
145
155
class TruffleBackend {
146
156
method stages () {
147
- ' truffle'
157
+ ' tast truffle'
158
+ }
159
+
160
+ method tast ($ qast , * % adverbs ) {
161
+ QAST ::TruffleCompiler. compile($ qast );
148
162
}
149
163
150
- method truffle ($ qast , * % adverbs ) {
164
+ method truffle ($ tast , * % adverbs ) {
151
165
sub (* @ args ) {
152
- QAST ::TruffleCompiler . run ($ qast );
166
+ $ tast . run ();
153
167
}
154
168
}
155
169
0 commit comments