-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbranflakes.py
105 lines (92 loc) · 2.14 KB
/
branflakes.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
from boiga import *
ASCII_LUT = Literal("�"*0x1f + bytes(range(0x20, 0x7f)).decode())
project = Project()
stdout = project.stage.new_list("stdout", [], monitor=[0, 0, 480-2, 292])
sprite = project.new_sprite("Branflakes")
bfmem = sprite.new_list("bfmem")
memptr = sprite.new_var("memptr")
@sprite.proc_def()
def putchar(locals, codepoint): return [
If (codepoint == 0x0a) [
stdout.append(locals.line_buffer),
locals.line_buffer <= ""
].Else [
If (codepoint == 0x0d) [
locals.line_buffer <= ""
].Else [
locals.line_buffer <= locals.line_buffer.join(ASCII_LUT[codepoint-1])
]
]
]
def compile_bf(prog, is_subblock=False):
compiled = []
i = 0
ptrshift = 0
while i < len(prog):
if prog[i] in "+-":
delta = 0
while i < len(prog) and prog[i] in "+-":
delta += 1 if prog[i] == "+" else -1
i += 1
compiled.append(
bfmem[memptr+ptrshift] <= (bfmem[memptr+ptrshift] + delta) & 0xff
)
elif prog[i] in "><":
delta = 0
while i < len(prog) and prog[i] in "><":
delta += 1 if prog[i] == ">" else -1
i += 1
ptrshift += delta
elif prog[i] == "[":
depth = 0
i += 1
body = ""
while i < len(prog):
if prog[i] == "[":
depth += 1
elif prog[i] == "]":
if depth:
depth -= 1
else:
i += 1
break
body += prog[i]
i += 1
else:
raise Exception("Unexpected EOF")
compiled += [
memptr.changeby(ptrshift) if ptrshift else [],
RepeatUntil (bfmem[memptr] == 0) [
compile_bf(body, is_subblock=True)
]
]
ptrshift = 0
elif prog[i] == "]":
raise Exception("Unexpected ]")
elif prog[i] == ",":
raise Exception("Not implemented: ,")
elif prog[i] == ".":
compiled.append(
putchar(bfmem[memptr+ptrshift])
)
i += 1
else:
i += 1
if is_subblock and ptrshift:
compiled.append(
memptr.changeby(ptrshift)
)
return compiled
@sprite.proc_def(turbo=False)
def bf_main(locals):
return compile_bf(open("examples/assets/beer.b").read())
sprite.on_flag([
stdout.delete_all(),
bfmem.delete_all(),
Repeat (30000) [
bfmem.append(0)
],
memptr <= 0,
bf_main()
])
project.save("examples/out/Boiga Examples: Branflakes.sb3")