25 | 25 |
self.typedecls = data[0]
|
26 | 26 |
self.vardecls = data[1]
|
27 | 27 |
self.block = data[2]
|
28 | |
def __repr__(self):
|
29 | |
return "%s(%s, %s, %s)" % (self.__class__.__name__, repr(self.typedecls), repr(self.vardecls), repr(self.block))
|
|
28 |
|
|
29 |
def __repr__(self):
|
|
30 |
return "%s(%s, %s, %s)" % (
|
|
31 |
self.__class__.__name__,
|
|
32 |
repr(self.typedecls), repr(self.vardecls), repr(self.block)
|
|
33 |
)
|
|
34 |
|
30 | 35 |
def typecheck(self, types, vars):
|
31 | 36 |
for typedecl in self.typedecls:
|
32 | 37 |
typedecl.typecheck(types, vars)
|
33 | 38 |
for vardecl in self.vardecls:
|
34 | 39 |
vardecl.typecheck(types, vars)
|
35 | 40 |
self.block.typecheck(types, vars)
|
|
41 |
|
36 | 42 |
def vanalyze(self, context):
|
37 | 43 |
self.block.vanalyze(context)
|
|
44 |
|
38 | 45 |
def emit(self, stream, options):
|
39 | 46 |
stream.write("""\
|
40 | 47 |
/* Achtung! This Source was Automatically Generated by %s! */
|
|
110 | 117 |
class Block(object):
|
111 | 118 |
def __init__(self, data):
|
112 | 119 |
self.stmts = data[1]
|
|
120 |
|
113 | 121 |
def __repr__(self):
|
114 | 122 |
return "%s(%s)" % (self.__class__.__name__, repr(self.stmts))
|
|
123 |
|
115 | 124 |
def typecheck(self, types, vars):
|
116 | 125 |
block_types = Context(parent=types)
|
117 | 126 |
block_vars = Context(parent=vars)
|
118 | 127 |
for stmt in self.stmts:
|
119 | 128 |
stmt.typecheck(block_types, block_vars)
|
|
129 |
|
120 | 130 |
def vanalyze(self, context):
|
121 | 131 |
for stmt in self.stmts:
|
122 | 132 |
stmt.vanalyze(context)
|
|
133 |
|
123 | 134 |
def emit(self, stream):
|
124 | 135 |
for stmt in self.stmts:
|
125 | 136 |
stmt.emit(stream)
|
126 | 137 |
|
|
138 |
|
127 | 139 |
class TypeDecl(object):
|
128 | 140 |
def __init__(self, data):
|
129 | 141 |
self.name = data[1]
|
130 | 142 |
self.type = data[2]
|
|
143 |
|
131 | 144 |
def __repr__(self):
|
132 | 145 |
return "TypeDecl(%s, %s)" % (repr(self.name), repr(self.type))
|
|
146 |
|
133 | 147 |
def typecheck(self, types, vars):
|
134 | 148 |
types.declare(self.name, self.type)
|
135 | 149 |
self.type.typecheck(types, vars)
|
136 | 150 |
if not isinstance(self.type, TypeStruct):
|
137 | |
raise TypeError, "Only structs may be named"
|
|
151 |
raise TypeError("Only structs may be named")
|
138 | 152 |
return self.type
|
|
153 |
|
139 | 154 |
def emit(self, stream, options):
|
140 | 155 |
if isinstance(self.type, TypeStruct):
|
141 | 156 |
stream.write("typedef \n")
|
|
143 | 158 |
stream.write(" %s;\n" % self.name)
|
144 | 159 |
self.type.emit(stream)
|
145 | 160 |
stream.write(";\n")
|
146 | |
stream.write("static void mark_%s(_ptr outcast, %s* p) {" % (self.name, self.name))
|
147 | |
marking_text = options.pointer_format + (" @%s " % self.name) + options.pointer_format
|
|
161 |
stream.write("static void mark_%s(_ptr outcast, %s* p) {" %
|
|
162 |
(self.name, self.name))
|
|
163 |
marking_text = (options.pointer_format + (" @%s " % self.name) +
|
|
164 |
options.pointer_format)
|
148 | 165 |
stream.write(r"""
|
149 | 166 |
#ifdef TRACE_MARKING
|
150 | 167 |
fprintf(stderr, "-> BEGIN marking %s\n", (long)outcast.p, (long)p);
|
|
175 | 192 |
|
176 | 193 |
# These classes double as AST components and as type expressions.
|
177 | 194 |
|
|
195 |
|
178 | 196 |
class Type(object):
|
179 | 197 |
def equiv(self, other):
|
180 | 198 |
raise NotImplementedError
|
|
199 |
|
181 | 200 |
def points_to(self):
|
182 | 201 |
return None
|
|
202 |
|
183 | 203 |
def resolve(self, types):
|
184 | 204 |
return self
|
|
205 |
|
185 | 206 |
def get_member_type(self, name):
|
186 | 207 |
return None
|
|
208 |
|
187 | 209 |
|
188 | 210 |
class TypeVoid(Type):
|
189 | 211 |
def __init__(self, data=None):
|
190 | 212 |
pass
|
|
213 |
|
191 | 214 |
def equiv(self, other):
|
192 | 215 |
return isinstance(other, TypeVoid)
|
|
216 |
|
193 | 217 |
def emit(self, stream):
|
194 | 218 |
stream.write("void")
|
|
219 |
|
195 | 220 |
|
196 | 221 |
class TypeInt(Type):
|
197 | 222 |
def __init__(self, data=None):
|
198 | 223 |
pass
|
|
224 |
|
199 | 225 |
def __repr__(self):
|
200 | 226 |
return "%s()" % (self.__class__.__name__)
|
|
227 |
|
201 | 228 |
def typecheck(self, types, vars):
|
202 | 229 |
return self
|
|
230 |
|
203 | 231 |
def equiv(self, other):
|
204 | 232 |
return isinstance(other, TypeInt)
|
|
233 |
|
205 | 234 |
def emit(self, stream):
|
206 | 235 |
stream.write("int")
|
207 | 236 |
|
|
237 |
|
208 | 238 |
struct_id = 0
|
|
239 |
|
|
240 |
|
209 | 241 |
class TypeStruct(Type):
|
210 | 242 |
def __init__(self, data):
|
211 | 243 |
global struct_id
|
212 | 244 |
self.members = data[2]
|
213 | 245 |
self.id = struct_id
|
214 | 246 |
struct_id += 1
|
|
247 |
|
215 | 248 |
def __repr__(self):
|
216 | 249 |
return "%s(%s)" % (self.__class__.__name__, repr(self.members))
|
|
250 |
|
217 | 251 |
def typecheck(self, types, vars):
|
218 | 252 |
for member in self.members:
|
219 | 253 |
type_ = member.typecheck(types, vars)
|
220 | 254 |
if isinstance(type_, TypeStruct):
|
221 | |
raise TypeError, "Structs may not contain other structs"
|
|
255 |
raise TypeError("Structs may not contain other structs")
|
222 | 256 |
return self
|
|
257 |
|
223 | 258 |
def equiv(self, other):
|
224 | 259 |
return False
|
|
260 |
|
225 | 261 |
def emit(self, stream):
|
226 | 262 |
stream.write("struct s_%s {\n" % self.id)
|
227 | 263 |
for member in self.members:
|
228 | 264 |
member.emit(stream)
|
229 | 265 |
stream.write("}")
|
|
266 |
|
230 | 267 |
def emit_forward(self, stream):
|
231 | 268 |
stream.write("struct s_%s" % self.id)
|
|
269 |
|
232 | 270 |
def get_member_type(self, name):
|
233 | 271 |
for decl in self.members:
|
234 | 272 |
if decl.name == name:
|
235 | 273 |
return decl.type
|
236 | 274 |
return None
|
237 | 275 |
|
|
276 |
|
238 | 277 |
class TypePtr(Type):
|
239 | 278 |
def __init__(self, data):
|
240 | 279 |
self.target = data[2]
|
|
280 |
|
241 | 281 |
def __repr__(self):
|
242 | 282 |
return "%s(%s)" % (self.__class__.__name__, repr(self.target))
|
|
283 |
|
243 | 284 |
def typecheck(self, types, vars):
|
244 | 285 |
self.target.typecheck(types, vars)
|
245 | 286 |
if isinstance(self.target, TypeNamed):
|
246 | 287 |
return self
|
247 | 288 |
else:
|
248 | |
raise TypeError, "Pointer type must point to named type"
|
|
289 |
raise TypeError("Pointer type must point to named type")
|
|
290 |
|
249 | 291 |
def equiv(self, other):
|
250 | 292 |
return isinstance(other, TypePtr) and self.target.equiv(other.target)
|
|
293 |
|
251 | 294 |
def points_to(self):
|
252 | 295 |
return self.target
|
|
296 |
|
253 | 297 |
def emit(self, stream):
|
254 | 298 |
stream.write("/* ")
|
255 | 299 |
self.target.emit(stream)
|
|
257 | 301 |
stream.write(" */ ")
|
258 | 302 |
stream.write("_ptr")
|
259 | 303 |
|
|
304 |
|
260 | 305 |
class TypeNamed(Type):
|
261 | 306 |
def __init__(self, data):
|
262 | 307 |
self.name = data
|
|
308 |
|
263 | 309 |
def __repr__(self):
|
264 | 310 |
return "%s(%s)" % (self.__class__.__name__, repr(self.name))
|
265 | |
def typecheck(self, types, vars):
|
266 | |
return True # can't look self up yet, might not exist yet
|
|
311 |
|
|
312 |
def typecheck(self, types, vars):
|
|
313 |
return True # can't look self up yet, might not exist yet
|
|
314 |
|
267 | 315 |
def equiv(self, other):
|
268 | 316 |
return isinstance(other, TypeNamed) and self.name == other.name
|
|
317 |
|
269 | 318 |
def emit(self, stream):
|
270 | 319 |
stream.write(self.name)
|
|
320 |
|
271 | 321 |
def resolve(self, types):
|
272 | 322 |
return types.lookup(self.name)
|
273 | 323 |
|
|
324 |
|
274 | 325 |
class Decl(object):
|
275 | 326 |
def __init__(self, data):
|
276 | 327 |
self.type = data[0]
|
277 | 328 |
self.name = data[1]
|
278 | |
def __repr__(self):
|
279 | |
return "%s(%s, %s)" % (self.__class__.__name__, repr(self.name), repr(self.type))
|
|
329 |
|
|
330 |
def __repr__(self):
|
|
331 |
return "%s(%r, %r)" % (self.__class__.__name__, self.name, self.type)
|
|
332 |
|
280 | 333 |
def typecheck(self, types, vars):
|
281 | 334 |
self.type.typecheck(types, vars)
|
282 | 335 |
return self.type
|
|
336 |
|
283 | 337 |
def emit(self, stream):
|
284 | 338 |
self.type.emit(stream)
|
285 | 339 |
stream.write(" %s;\n" % self.name)
|
|
340 |
|
286 | 341 |
|
287 | 342 |
class VarDecl(object):
|
288 | 343 |
def __init__(self, data):
|
289 | 344 |
decl = data[1]
|
290 | 345 |
self.type = decl.type
|
291 | 346 |
self.name = decl.name
|
|
347 |
|
292 | 348 |
def __repr__(self):
|
293 | 349 |
return "%s(%s, %s)" % (self.__class__.__name__, repr(self.name), repr(self.type))
|
|
350 |
|
294 | 351 |
def typecheck(self, types, vars):
|
295 | 352 |
self.type.typecheck(types, vars)
|
296 | 353 |
vars.declare(self.name, self.type)
|
297 | 354 |
return self.type
|
|
355 |
|
298 | 356 |
def emit(self, stream):
|
299 | 357 |
self.type.emit(stream)
|
300 | 358 |
stream.write(" %s;\n" % self.name)
|
|
359 |
|
301 | 360 |
def emit_marker(self, stream):
|
302 | 361 |
if isinstance(self.type, TypePtr):
|
303 | 362 |
stream.write("""
|
|
310 | 369 |
self.type.points_to().emit(stream)
|
311 | 370 |
stream.write(" *)%s.p);\n }\n" % self.name)
|
312 | 371 |
|
|
372 |
|
313 | 373 |
class WhileStmt(object):
|
314 | 374 |
def __init__(self, data):
|
315 | 375 |
self.expr = data[1]
|
316 | 376 |
self.block = data[2]
|
|
377 |
|
317 | 378 |
def __repr__(self):
|
318 | 379 |
return "%s(%s, %s)" % (self.__class__.__name__, repr(self.expr), repr(self.block))
|
|
380 |
|
319 | 381 |
def typecheck(self, types, vars):
|
320 | 382 |
self.expr.typecheck(types, vars)
|
321 | 383 |
self.block.typecheck(types, vars)
|
322 | 384 |
return TypeVoid()
|
|
385 |
|
323 | 386 |
def vanalyze(self, context):
|
324 | 387 |
self.expr.vanalyze(context)
|
325 | 388 |
self.block.vanalyze(context)
|
|
389 |
|
326 | 390 |
def emit(self, stream):
|
327 | 391 |
stream.write("while(")
|
328 | 392 |
self.expr.emit(stream)
|
329 | 393 |
stream.write(") {\n")
|
330 | 394 |
self.block.emit(stream)
|
331 | 395 |
stream.write("}\n")
|
|
396 |
|
332 | 397 |
|
333 | 398 |
class IfStmt(object):
|
334 | 399 |
def __init__(self, data):
|
|
339 | 404 |
self.else_ = elsepart[0][1]
|
340 | 405 |
else:
|
341 | 406 |
self.else_ = Block(['{', [], '}'])
|
|
407 |
|
342 | 408 |
def __repr__(self):
|
343 | 409 |
return "%s(%s, %s, %s)" % (self.__class__.__name__, repr(self.expr), repr(self.then), repr(self.else_))
|
|
410 |
|
344 | 411 |
def typecheck(self, types, vars):
|
345 | 412 |
self.expr.typecheck(types, vars)
|
346 | 413 |
self.then.typecheck(types, vars)
|
347 | 414 |
self.else_.typecheck(types, vars)
|
348 | 415 |
return TypeVoid()
|
|
416 |
|
349 | 417 |
def vanalyze(self, context):
|
350 | 418 |
self.expr.vanalyze(context)
|
351 | 419 |
# If the test expr is exactly "valid x", put x into context,
|
|
356 | 424 |
subcontext[self.expr.expr.name] = True
|
357 | 425 |
self.then.vanalyze(subcontext)
|
358 | 426 |
self.else_.vanalyze(context)
|
|
427 |
|
359 | 428 |
def emit(self, stream):
|
360 | 429 |
stream.write("if(")
|
361 | 430 |
self.expr.emit(stream)
|
|
365 | 434 |
self.else_.emit(stream)
|
366 | 435 |
stream.write("}\n")
|
367 | 436 |
|
|
437 |
|
368 | 438 |
class FreeStmt(object):
|
369 | 439 |
def __init__(self, data):
|
370 | 440 |
self.ref = data[1]
|
|
441 |
|
371 | 442 |
def __repr__(self):
|
372 | 443 |
return "%s(%s)" % (self.__class__.__name__, repr(self.ref))
|
|
444 |
|
373 | 445 |
def typecheck(self, types, vars):
|
374 | 446 |
ref_type = self.ref.typecheck(types, vars)
|
375 | 447 |
if ref_type.points_to() is None:
|
376 | |
raise TypeError, "%s is not a pointer type" % repr(ref_type)
|
|
448 |
raise TypeError("%r is not a pointer type" % ref_type)
|
377 | 449 |
return TypeVoid()
|
|
450 |
|
378 | 451 |
def vanalyze(self, context):
|
379 | 452 |
self.ref.vanalyze(context)
|
380 | 453 |
# End safe area -- remove all assertions of validity hereafter.
|
381 | 454 |
context.empty()
|
|
455 |
|
382 | 456 |
def emit(self, stream):
|
383 | 457 |
stream.write("_8ebed_free(&")
|
384 | 458 |
self.ref.emit(stream)
|
385 | 459 |
stream.write(");\n")
|
386 | 460 |
|
|
461 |
|
387 | 462 |
class PrintStmt(object):
|
388 | 463 |
def __init__(self, data):
|
389 | 464 |
self.expr = data[1]
|
|
465 |
|
390 | 466 |
def __repr__(self):
|
391 | 467 |
return "%s(%s)" % (self.__class__.__name__, repr(self.expr))
|
|
468 |
|
392 | 469 |
def typecheck(self, types, vars):
|
393 | 470 |
expr_type = self.expr.typecheck(types, vars)
|
394 | 471 |
if not expr_type.equiv(TypeInt()):
|
395 | |
raise TypeError, "%s is not an int" % repr(expr_type)
|
|
472 |
raise TypeError("%r is not an int" % expr_type)
|
396 | 473 |
return TypeVoid()
|
|
474 |
|
397 | 475 |
def vanalyze(self, context):
|
398 | 476 |
self.expr.vanalyze(context)
|
|
477 |
|
399 | 478 |
def emit(self, stream):
|
400 | 479 |
stream.write("printf(\"%d \", ")
|
401 | 480 |
self.expr.emit(stream)
|
402 | 481 |
stream.write(");\n")
|
403 | 482 |
|
|
483 |
|
404 | 484 |
class AssignStmt(object):
|
405 | 485 |
def __init__(self, data):
|
406 | 486 |
self.ref = data[0]
|
407 | 487 |
self.expr = data[2]
|
|
488 |
|
408 | 489 |
def __repr__(self):
|
409 | 490 |
return "%s(%s, %s)" % (self.__class__.__name__, repr(self.ref), repr(self.expr))
|
|
491 |
|
410 | 492 |
def typecheck(self, types, vars):
|
411 | 493 |
tlhs = self.ref.typecheck(types, vars)
|
412 | 494 |
trhs = self.expr.typecheck(types, vars)
|
413 | 495 |
if trhs.equiv(tlhs):
|
414 | 496 |
return TypeVoid()
|
415 | 497 |
else:
|
416 | |
raise TypeError, "%s (%s) not equivalent to %s (%s) for vars %s" % (repr(tlhs), repr(self.ref), repr(trhs), repr(self.expr), vars)
|
|
498 |
raise TypeError("%r (%r) not equivalent to %r (%r) for vars %s" %
|
|
499 |
(tlhs, self.ref, trhs, self.expr, vars))
|
|
500 |
|
417 | 501 |
def vanalyze(self, context):
|
418 | 502 |
self.ref.vanalyze(context)
|
419 | 503 |
self.expr.vanalyze(context)
|
420 | 504 |
# End safe area -- remove all assertions of validity hereafter.
|
421 | 505 |
context.empty()
|
|
506 |
|
422 | 507 |
def emit(self, stream):
|
423 | 508 |
self.ref.emit(stream)
|
424 | 509 |
stream.write(" = ")
|
425 | 510 |
self.expr.emit(stream)
|
426 | 511 |
stream.write(";\n")
|
427 | 512 |
|
|
513 |
|
428 | 514 |
class BinOpExpr(object):
|
429 | 515 |
map = {
|
430 | |
'+' : '+',
|
431 | |
'-' : '-',
|
432 | |
'*' : '*',
|
433 | |
'/' : '/',
|
434 | |
'=' : '==',
|
435 | |
'>' : '>',
|
436 | |
'&' : '&&',
|
437 | |
'|' : '||',
|
|
516 |
'+': '+',
|
|
517 |
'-': '-',
|
|
518 |
'*': '*',
|
|
519 |
'/': '/',
|
|
520 |
'=': '==',
|
|
521 |
'>': '>',
|
|
522 |
'&': '&&',
|
|
523 |
'|': '||',
|
438 | 524 |
}
|
|
525 |
|
439 | 526 |
def __init__(self, data):
|
440 | 527 |
self.lhs = data[1]
|
441 | 528 |
self.op = data[2]
|
442 | 529 |
self.rhs = data[3]
|
|
530 |
|
443 | 531 |
def __repr__(self):
|
444 | 532 |
return "%s(%s, %s, %s)" % (self.__class__.__name__, repr(self.lhs), repr(self.op), repr(self.rhs))
|
|
533 |
|
445 | 534 |
def typecheck(self, types, vars):
|
446 | 535 |
trhs = self.lhs.typecheck(types, vars)
|
447 | 536 |
tlhs = self.rhs.typecheck(types, vars)
|
448 | 537 |
if not tlhs.equiv(TypeInt()):
|
449 | |
raise TypeError, "lhs %s is not an int" % repr(tlhs)
|
|
538 |
raise TypeError("lhs %r is not an int" % tlhs)
|
450 | 539 |
if not trhs.equiv(TypeInt()):
|
451 | |
raise TypeError, "rhs %s is not an int" % repr(trhs)
|
|
540 |
raise TypeError("rhs %r is not an int" % trhs)
|
452 | 541 |
return TypeInt()
|
|
542 |
|
453 | 543 |
def vanalyze(self, context):
|
454 | 544 |
self.lhs.vanalyze(context)
|
455 | 545 |
self.rhs.vanalyze(context)
|
|
546 |
|
456 | 547 |
def emit(self, stream):
|
457 | 548 |
stream.write("(")
|
458 | 549 |
self.lhs.emit(stream)
|
|
460 | 551 |
self.rhs.emit(stream)
|
461 | 552 |
stream.write(")")
|
462 | 553 |
|
|
554 |
|
463 | 555 |
class MallocExpr(object):
|
464 | 556 |
def __init__(self, data):
|
465 | 557 |
self.type = data[1]
|
|
558 |
|
466 | 559 |
def __repr__(self):
|
467 | 560 |
return "%s(%s)" % (self.__class__.__name__, repr(self.type))
|
|
561 |
|
468 | 562 |
def typecheck(self, types, vars):
|
469 | 563 |
return TypePtr(['', '', self.type])
|
|
564 |
|
470 | 565 |
def vanalyze(self, context):
|
471 | 566 |
pass
|
|
567 |
|
472 | 568 |
def emit(self, stream):
|
473 | 569 |
stream.write("_8ebed_malloc(sizeof(")
|
474 | 570 |
self.type.emit(stream)
|
475 | 571 |
stream.write("))")
|
476 | 572 |
|
|
573 |
|
477 | 574 |
class ValidExpr(object):
|
478 | 575 |
def __init__(self, data):
|
479 | 576 |
self.expr = data[1]
|
|
577 |
|
480 | 578 |
def __repr__(self):
|
481 | 579 |
return "%s(%s)" % (self.__class__.__name__, repr(self.expr))
|
|
580 |
|
482 | 581 |
def typecheck(self, types, vars):
|
483 | 582 |
expr_type = self.expr.typecheck(types, vars)
|
484 | 583 |
if expr_type.points_to() is None:
|
485 | |
raise TypeError, "%s is not a pointer type" % repr(expr_type)
|
|
584 |
raise TypeError("%r is not a pointer type" % expr_type)
|
486 | 585 |
return TypeInt()
|
|
586 |
|
487 | 587 |
def vanalyze(self, context):
|
488 | 588 |
self.expr.vanalyze(context)
|
|
589 |
|
489 | 590 |
def emit(self, stream):
|
490 | 591 |
stream.write("_8ebed_valid(")
|
491 | 592 |
self.expr.emit(stream)
|
492 | 593 |
stream.write(")")
|
493 | 594 |
|
|
595 |
|
494 | 596 |
class DottedRef(object):
|
495 | 597 |
def __init__(self, data):
|
496 | 598 |
self.source = data[1]
|
497 | 599 |
self.member_name = data[4]
|
|
600 |
|
498 | 601 |
def __repr__(self):
|
499 | 602 |
return "%s(%s, %s)" % (self.__class__.__name__, repr(self.source), repr(self.member_name))
|
|
603 |
|
500 | 604 |
def typecheck(self, types, vars):
|
501 | 605 |
source_type = self.source.typecheck(types, vars)
|
502 | 606 |
source_type = source_type.resolve(types)
|
503 | 607 |
member_type = source_type.get_member_type(self.member_name)
|
504 | 608 |
if member_type is None:
|
505 | |
raise TypeError, "%s does not have member %s" % (repr(source_type), self.member_name)
|
|
609 |
raise TypeError("%r does not have member %s" %
|
|
610 |
(source_type, self.member_name))
|
506 | 611 |
return member_type
|
|
612 |
|
507 | 613 |
def vanalyze(self, context, deref=False):
|
508 | 614 |
self.source.vanalyze(context, deref=deref)
|
|
615 |
|
509 | 616 |
def emit(self, stream):
|
510 | 617 |
self.source.emit(stream)
|
511 | 618 |
stream.write(".%s" % self.member_name)
|
512 | 619 |
|
|
620 |
|
513 | 621 |
class DeRef(object):
|
514 | 622 |
def __init__(self, data):
|
515 | 623 |
self.source = data[1]
|
516 | 624 |
self._dest_type = None
|
|
625 |
|
517 | 626 |
def __repr__(self):
|
518 | 627 |
return "%s(%s)" % (self.__class__.__name__, repr(self.source))
|
|
628 |
|
519 | 629 |
def typecheck(self, types, vars):
|
520 | 630 |
source_type = self.source.typecheck(types, vars)
|
521 | 631 |
dest_type = source_type.points_to()
|
522 | 632 |
if dest_type is None:
|
523 | |
raise TypeError, "%s is not a pointer type" % repr(source_type)
|
|
633 |
raise TypeError("%r is not a pointer type" % source_type)
|
524 | 634 |
self._dest_type = dest_type
|
525 | 635 |
return dest_type
|
|
636 |
|
526 | 637 |
def vanalyze(self, context, deref=False):
|
527 | 638 |
self.source.vanalyze(context, deref=True)
|
|
639 |
|
528 | 640 |
def emit(self, stream):
|
529 | 641 |
stream.write("(*(")
|
530 | 642 |
self._dest_type.emit(stream)
|
|
532 | 644 |
self.source.emit(stream)
|
533 | 645 |
stream.write(".p)")
|
534 | 646 |
|
|
647 |
|
535 | 648 |
class VarRef(object):
|
536 | 649 |
def __init__(self, data):
|
537 | 650 |
self.name = data
|
|
651 |
|
538 | 652 |
def __repr__(self):
|
539 | 653 |
return "%s(%s)" % (self.__class__.__name__, repr(self.name))
|
|
654 |
|
540 | 655 |
def typecheck(self, types, vars):
|
541 | 656 |
#if self.name == 'i':
|
542 | 657 |
# raise NotImplementedError, vars.lookup(self.name)
|
543 | 658 |
return vars.lookup(self.name)
|
|
659 |
|
544 | 660 |
def vanalyze(self, context, deref=False):
|
545 | 661 |
if deref:
|
546 | 662 |
if not context.lookup(self.name, default=False):
|
547 | |
raise TypeError, "Attempt to dereference %s in non-safe context" % self.name
|
|
663 |
raise TypeError("Attempt to dereference %s "
|
|
664 |
"in non-safe context" % self.name)
|
|
665 |
|
548 | 666 |
def emit(self, stream):
|
549 | 667 |
stream.write(self.name)
|
550 | 668 |
|
|
669 |
|
551 | 670 |
class IntConst(object):
|
552 | 671 |
def __init__(self, data):
|
553 | 672 |
self.value = int(data)
|
|
673 |
|
554 | 674 |
def __repr__(self):
|
555 | 675 |
return "%s(%s)" % (self.__class__.__name__, repr(self.value))
|
|
676 |
|
556 | 677 |
def typecheck(self, types, vars):
|
557 | 678 |
return TypeInt()
|
|
679 |
|
558 | 680 |
def vanalyze(self, context, deref=False):
|
559 | 681 |
pass
|
|
682 |
|
560 | 683 |
def emit(self, stream):
|
561 | 684 |
stream.write(str(self.value))
|
562 | 685 |
|
|
594 | 717 |
Sequence(Terminal('valid'), NonTerminal('Expr')).construct(ValidExpr),
|
595 | 718 |
NonTerminal('IntLit').construct(IntConst),
|
596 | 719 |
NonTerminal('Ref'))
|
597 | |
g['BinOp'] = Alternation(Terminal('+'),Terminal('-'),Terminal('*'),Terminal('/'),Terminal('='),Terminal('>'),Terminal('&'), Terminal('|'))
|
|
720 |
g['BinOp'] = Alternation(Terminal('+'), Terminal('-'), Terminal('*'),
|
|
721 |
Terminal('/'), Terminal('='), Terminal('>'),
|
|
722 |
Terminal('&'), Terminal('|'))
|
598 | 723 |
|
599 | 724 |
g['TypeName'] = Terminal(lambda x: re.match('^[a-zA-Z]\w*$', x))
|
600 | 725 |
g['VarName'] = Terminal(lambda x: re.match('^[a-zA-Z]\w*$', x))
|
|
610 | 735 |
s = Stream(r(text))
|
611 | 736 |
return g.parse('Eightebed', s)
|
612 | 737 |
|
|
738 |
|
613 | 739 |
def parse_file(filename):
|
614 | 740 |
f = open(filename, "r")
|
615 | 741 |
contents = f.read()
|