Simply always produce ForwardReferences in locexpr(forward=True).
Chris Pressey
6 years ago
111 | 111 | |
112 | 112 | program = Program(self.scanner.line_number, defns=defns, routines=routines) |
113 | 113 | |
114 | def resolve_fwd_reference(obj, field): | |
115 | field_value = getattr(obj, field, None) | |
116 | if isinstance(field_value, ForwardReference): | |
117 | setattr(obj, field, self.lookup(field_value.name)) | |
118 | elif isinstance(field_value, IndexedRef): | |
119 | if isinstance(field_value.ref, ForwardReference): | |
120 | field_value.ref = self.lookup(field_value.ref.name) | |
121 | ||
114 | 122 | for node in program.all_children(): |
115 | 123 | if isinstance(node, SingleOp): |
116 | instr = node | |
117 | if isinstance(instr.location, ForwardReference): | |
118 | instr.location = self.lookup(instr.location.name) | |
119 | if isinstance(instr.src, ForwardReference): | |
120 | instr.src = self.lookup(instr.src.name) | |
121 | if isinstance(instr.dest, ForwardReference): | |
122 | instr.dest = self.lookup(instr.dest.name) | |
124 | resolve_fwd_reference(node, 'location') | |
125 | resolve_fwd_reference(node, 'src') | |
126 | resolve_fwd_reference(node, 'dest') | |
123 | 127 | |
124 | 128 | return program |
125 | 129 | |
338 | 342 | elif forward: |
339 | 343 | name = self.scanner.token |
340 | 344 | self.scanner.scan() |
341 | loc = self.context.fetch(name) | |
342 | if loc is not None: | |
343 | return loc | |
344 | else: | |
345 | return ForwardReference(name) | |
345 | return ForwardReference(name) | |
346 | 346 | else: |
347 | 347 | loc = self.lookup(self.scanner.token) |
348 | 348 | self.scanner.scan() |