locexpr() always returns a ForwardReference if it can't lookup it.
Chris Pressey
4 years ago
356 | 356 | accum.append(self.locexpr()) |
357 | 357 | return accum |
358 | 358 | |
359 | def locexpr(self, forward=False): | |
359 | def locexpr(self): | |
360 | 360 | if self.scanner.token in ('on', 'off', 'word') or self.scanner.token in self.context.consts or self.scanner.on_type('integer literal'): |
361 | 361 | return self.const() |
362 | elif forward: | |
362 | else: | |
363 | 363 | name = self.scanner.token |
364 | 364 | self.scanner.scan() |
365 | return ForwardReference(name) | |
366 | else: | |
367 | loc = self.lookup(self.scanner.token) | |
368 | self.scanner.scan() | |
369 | return loc | |
370 | ||
371 | def indlocexpr(self, forward=False): | |
365 | loc = self.context.fetch(name) | |
366 | if loc: | |
367 | return loc | |
368 | else: | |
369 | return ForwardReference(name) | |
370 | ||
371 | def indlocexpr(self): | |
372 | 372 | if self.scanner.consume('['): |
373 | 373 | loc = self.locexpr() |
374 | 374 | self.scanner.expect(']') |
379 | 379 | loc = self.locexpr() |
380 | 380 | return AddressRef(loc) |
381 | 381 | else: |
382 | return self.indexed_locexpr(forward=forward) | |
383 | ||
384 | def indexed_locexpr(self, forward=False): | |
385 | loc = self.locexpr(forward=forward) | |
382 | return self.indexed_locexpr() | |
383 | ||
384 | def indexed_locexpr(self): | |
385 | loc = self.locexpr() | |
386 | 386 | if not isinstance(loc, str): |
387 | 387 | index = None |
388 | 388 | if self.scanner.consume('+'): |
482 | 482 | elif self.scanner.token in ("copy",): |
483 | 483 | opcode = self.scanner.token |
484 | 484 | self.scanner.scan() |
485 | src = self.indlocexpr(forward=True) | |
485 | src = self.indlocexpr() | |
486 | 486 | self.scanner.expect(',') |
487 | 487 | dest = self.indlocexpr() |
488 | 488 | instr = SingleOp(self.scanner.line_number, opcode=opcode, dest=dest, src=src) |