81 | 81 |
self.indent_ -= 1
|
82 | 82 |
|
83 | 83 |
def emit(self, *args):
|
84 | |
self.outfile.write(" " * self.indent_ + ''.join(args) + "\n")
|
|
84 |
s = " " * self.indent_ + ''.join(args) + "\n"
|
|
85 |
self.outfile.write(s.encode('UTF-8'))
|
85 | 86 |
|
86 | 87 |
def compile(self):
|
87 | 88 |
self.emit(PRELUDE)
|
|
125 | 126 |
all_pattern_variables = set()
|
126 | 127 |
|
127 | 128 |
# emit matching code
|
128 | |
i = 0
|
|
129 |
fml_num = 0
|
129 | 130 |
for f in formals:
|
130 | |
self.emit_term(f, "pattern%s" % i, pattern=True)
|
131 | |
self.emit("if (!term_match(pattern%s, i%s)) {" % (i, i))
|
|
131 |
self.emit_term(f, "pattern%s" % fml_num, pattern=True)
|
|
132 |
self.emit("if (!term_match(pattern%s, i%s)) {" %
|
|
133 |
(fml_num, fml_num)
|
|
134 |
)
|
132 | 135 |
self.indent()
|
133 | 136 |
|
134 | |
# ...
|
135 | 137 |
next = None
|
136 | |
for prod in self.program.prodmap[self.current_prod_name]:
|
137 | |
if prod.rank == ast.rank + 1:
|
138 | |
next = prod
|
139 | |
break
|
|
138 |
myprods = self.program.prodmap[self.current_prod_name]
|
|
139 |
if ast.rank + 1 < len(myprods):
|
|
140 |
next = myprods[ast.rank + 1]
|
140 | 141 |
|
141 | 142 |
if next:
|
142 | 143 |
args = ', '.join(["i%s" % i for i in xrange(0, len(formals))])
|
|
157 | 158 |
for variable in variables:
|
158 | 159 |
self.emit('struct term *%s = '
|
159 | 160 |
'term_find_variable(pattern%s, "%s");' %
|
160 | |
(variable.name, i, variable.name)
|
|
161 |
(variable.name, fml_num, variable.name)
|
161 | 162 |
)
|
162 | 163 |
all_pattern_variables.add(variable.name)
|
163 | 164 |
|
164 | |
i += 1
|
|
165 |
self.emit("")
|
|
166 |
fml_num += 1
|
165 | 167 |
|
166 | 168 |
for local in locals_:
|
167 | 169 |
if local not in all_pattern_variables:
|
|
342 | 344 |
elif isinstance(term, Variable):
|
343 | 345 |
if pattern:
|
344 | 346 |
self.emit('struct term *%s = term_new_variable("%s", %s);' %
|
345 | |
(name, term.name, 'term_new("nil_%s")'))
|
|
347 |
(name, term.name, 'term_new("nil_%s")' % term.name))
|
346 | 348 |
else:
|
347 | 349 |
self.emit('struct term *%s = %s;' % (name, term.name))
|
348 | 350 |
else:
|
|
361 | 363 |
escaped_name = s
|
362 | 364 |
escaped_name = escaped_name.replace("\\", r"\\")
|
363 | 365 |
escaped_name = escaped_name.replace("\n", r"\n")
|
|
366 |
escaped_name = escaped_name.replace("\r", r"\r")
|
364 | 367 |
escaped_name = escaped_name.replace("\t", r"\t")
|
365 | 368 |
escaped_name = escaped_name.replace('"', r'\"')
|
366 | 369 |
return escaped_name
|