mirror of
https://github.com/catseye/SixtyPical.git
synced 2024-11-25 23:49:17 +00:00
Add some failing tests for analyzing "for".
This commit is contained in:
parent
d815e05e0c
commit
f73a2313bd
@ -1,6 +1,6 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
from sixtypical.ast import Program, Routine, Block, Instr, SingleOp, If, Repeat, WithInterruptsOff
|
||||
from sixtypical.ast import Program, Routine, Block, Instr, SingleOp, If, Repeat, For, WithInterruptsOff
|
||||
from sixtypical.model import (
|
||||
TYPE_BYTE, TYPE_WORD,
|
||||
TableType, BufferType, PointerType, VectorType, RoutineType,
|
||||
@ -329,6 +329,8 @@ class Analyzer(object):
|
||||
self.analyze_if(instr, context)
|
||||
elif isinstance(instr, Repeat):
|
||||
self.analyze_repeat(instr, context)
|
||||
elif isinstance(instr, For):
|
||||
self.analyze_for(instr, context)
|
||||
elif isinstance(instr, WithInterruptsOff):
|
||||
self.analyze_block(instr.block, context)
|
||||
else:
|
||||
@ -611,3 +613,12 @@ class Analyzer(object):
|
||||
self.analyze_block(instr.block, context)
|
||||
if instr.src is not None:
|
||||
context.assert_meaningful(instr.src)
|
||||
|
||||
def analyze_for(self, instr, context):
|
||||
# TODO: find the range of the loop variable in context, make sure it fits
|
||||
|
||||
# TODO: set the loop variable as 'not writeable' in the context
|
||||
|
||||
self.analyze_block(instr.block, context)
|
||||
|
||||
# TODO: at the end of the loop, we know the new range of the loop variable
|
||||
|
@ -1659,6 +1659,56 @@ The body of `repeat forever` can be empty.
|
||||
| }
|
||||
= ok
|
||||
|
||||
### for ###
|
||||
|
||||
Basic "open-faced for" loop. We'll start with the "upto" variant.
|
||||
|
||||
In a "for" loop, we know the exact range the loop variable takes on.
|
||||
|
||||
| byte table[16] tab
|
||||
|
|
||||
| define foo routine inputs tab trashes a, x, c, z, v, n {
|
||||
| ld x, 0
|
||||
| for x upto 15 {
|
||||
| ld a, tab + x
|
||||
| }
|
||||
| }
|
||||
= ok
|
||||
|
||||
| byte table[15] tab
|
||||
|
|
||||
| define foo routine inputs tab trashes a, x, c, z, v, n {
|
||||
| ld x, 0
|
||||
| for x upto 15 {
|
||||
| ld a, tab + x
|
||||
| }
|
||||
| }
|
||||
? RangeExceededError
|
||||
|
||||
You cannot modify the loop variable in a "for" loop.
|
||||
|
||||
| byte table[16] tab
|
||||
|
|
||||
| define foo routine inputs tab trashes a, x, c, z, v, n {
|
||||
| ld x, 0
|
||||
| for x upto 15 {
|
||||
| ld x, 0
|
||||
| }
|
||||
| }
|
||||
? ForbiddenWriteError
|
||||
|
||||
If the range isn't known to be smaller than the final value, you can't go up to it.
|
||||
|
||||
| byte table[32] tab
|
||||
|
|
||||
| define foo routine inputs tab trashes a, x, c, z, v, n {
|
||||
| ld x, 16
|
||||
| for x upto 15 {
|
||||
| ld a, tab + x
|
||||
| }
|
||||
| }
|
||||
? RangeExceededError
|
||||
|
||||
### copy ###
|
||||
|
||||
Can't `copy` from a memory location that isn't initialized.
|
||||
|
Loading…
Reference in New Issue
Block a user