14 | 14 |
GetVar, SetVar, Unifier, PatternMatch,
|
15 | 15 |
DeclState, SaveState, RestoreState,
|
16 | 16 |
)
|
|
17 |
from tamsin.ast import AtomNode # bah
|
17 | 18 |
from tamsin.term import Atom, Constructor, Variable
|
18 | 19 |
import tamsin.sysmod
|
19 | 20 |
|
|
115 | 116 |
self.indent_ -= 1
|
116 | 117 |
|
117 | 118 |
def emit(self, *args):
|
|
119 |
s = " " * self.indent_ + ''.join(args)
|
|
120 |
self.outfile.write(s)
|
|
121 |
|
|
122 |
def emitln(self, *args):
|
118 | 123 |
s = " " * self.indent_ + ''.join(args) + "\n"
|
119 | 124 |
self.outfile.write(s)
|
|
125 |
|
|
126 |
# kontinue the line
|
|
127 |
def emitk(self, *args):
|
|
128 |
self.outfile.write(''.join(args))
|
|
129 |
|
|
130 |
def emitkln(self, *args):
|
|
131 |
self.outfile.write(''.join(args) + "\n")
|
120 | 132 |
|
121 | 133 |
def go(self):
|
122 | 134 |
self.outfile.write(PRELUDE)
|
|
128 | 140 |
for arg in codenode.args:
|
129 | 141 |
self.traverse(arg)
|
130 | 142 |
elif isinstance(codenode, Prototype):
|
131 | |
self.emit("void prod_%s_%s(%s);" % (
|
|
143 |
self.emitln("void prod_%s_%s(%s);" % (
|
132 | 144 |
codenode['module'].name, codenode['prod'].name,
|
133 | 145 |
', '.join(["const struct term *"
|
134 | 146 |
for f in codenode['formals']])
|
|
139 | 151 |
fmls.append("const struct term *i%s" % i)
|
140 | 152 |
fmls = ', '.join(fmls)
|
141 | 153 |
|
142 | |
self.emit("void prod_%s_%s(%s) {" %
|
|
154 |
self.emitln("void prod_%s_%s(%s) {" %
|
143 | 155 |
(codenode['module'].name, codenode['prod'].name, fmls)
|
144 | 156 |
)
|
145 | 157 |
self.indent()
|
146 | 158 |
for arg in codenode.args:
|
147 | 159 |
self.traverse(arg)
|
148 | 160 |
self.outdent()
|
149 | |
self.emit("}")
|
|
161 |
self.emitln("}")
|
150 | 162 |
elif isinstance(codenode, Unifier):
|
151 | |
self.emit("/* %r */" % codenode)
|
|
163 |
self.emitln("/* %r */" % codenode)
|
152 | 164 |
elif isinstance(codenode, If):
|
153 | 165 |
self.emit("if (")
|
154 | 166 |
self.traverse(codenode[0])
|
155 | |
self.emit(") {")
|
|
167 |
self.emitkln(") {")
|
|
168 |
self.indent()
|
156 | 169 |
self.traverse(codenode[1])
|
157 | |
self.emit("} else {")
|
|
170 |
self.outdent()
|
|
171 |
self.emitln("} else {")
|
|
172 |
self.indent()
|
158 | 173 |
self.traverse(codenode[2])
|
159 | |
self.emit("}")
|
|
174 |
self.outdent()
|
|
175 |
self.emitln("}")
|
160 | 176 |
elif isinstance(codenode, Not):
|
161 | |
self.emit("(!(")
|
|
177 |
self.emitk("(!(")
|
162 | 178 |
self.traverse(codenode[0])
|
163 | |
self.emit("))")
|
|
179 |
self.emitk("))")
|
164 | 180 |
elif isinstance(codenode, Truth):
|
165 | |
self.emit("1")
|
|
181 |
self.emitk("1")
|
166 | 182 |
elif isinstance(codenode, Block):
|
167 | 183 |
for arg in codenode.args:
|
168 | 184 |
self.traverse(arg)
|
169 | 185 |
elif isinstance(codenode, Builtin):
|
170 | |
self.emit("/* %r */" % codenode)
|
|
186 |
self.emitln("/* %r */" % codenode)
|
|
187 |
if codenode['name'] == 'print':
|
|
188 |
self.emit("result = ")
|
|
189 |
self.traverse(codenode[0])
|
|
190 |
self.emitkln(';')
|
|
191 |
self.emitln("term_fput(result, stdout);")
|
|
192 |
self.emitln(r'fwrite("\n", 1, 1, stdout);')
|
|
193 |
self.emitln("ok = 1;")
|
|
194 |
elif codenode['name'] == 'return':
|
|
195 |
self.emit("result = ")
|
|
196 |
self.traverse(codenode[0])
|
|
197 |
self.emitkln(';')
|
|
198 |
else:
|
|
199 |
raise NotImplementedError(repr(codenode))
|
|
200 |
elif isinstance(codenode, AtomNode):
|
|
201 |
self.emitk('term_new_atom_from_cstring("%s")' % codenode.text)
|
171 | 202 |
elif isinstance(codenode, Return):
|
172 | |
self.emit("return ")
|
173 | |
self.traverse(codenode[0])
|
|
203 |
self.emitln("return;")
|
174 | 204 |
elif isinstance(codenode, NoMatch):
|
175 | |
self.emit("/* %r */" % codenode)
|
|
205 |
self.emitln('result = term_new_atom_from_cstring'
|
|
206 |
'("No \'%s\' production matched arguments ");' %
|
|
207 |
codenode['prod'].name)
|
|
208 |
for i in xrange(0, len(codenode['formals'])):
|
|
209 |
self.emitln('result = term_concat(result, term_flatten(i%d));' % i)
|
|
210 |
self.emitln('result = term_concat(result, term_new_atom_from_cstring(", "));')
|
|
211 |
self.emitln("ok = 0;")
|
176 | 212 |
else:
|
177 | 213 |
raise NotImplementedError(repr(codenode))
|
178 | 214 |
|