-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbf-interpreter.tpl
More file actions
153 lines (129 loc) · 7.23 KB
/
Copy pathbf-interpreter.tpl
File metadata and controls
153 lines (129 loc) · 7.23 KB
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
{{- /* NOTE: add `-` not to output verbose spaces and indents */ -}}
{{- /* constants */ -}}
{{- /* looper is used for range block loop */ -}}
{{- /* NOTE: interpreter resources
Looper length: 16
memory size: (len $Looper)^2
source length limit: (len $Looper)^3
counter in each byte: (len $Looper)^2 (, which is 256)
*/ -}}
{{- $Looper := (index .items 0).metadata.annotations -}}
{{- /* brainf*ck source */ -}}
{{- $Source := (index .items 0).metadata.annotations.src -}}
{{- /* stdin string for bf interpreter */ -}}
{{- $Stdin := (index .items 0).metadata.annotations.input -}}
{{- /* variables */ -}}
{{- /* initalize memory ((len $Looper)^2 bytes filled with 0) */ -}}
{{- $memory := "" -}}
{{- range $Looper -}}
{{- range $Looper -}}
{{- $memory = print $memory "\x00" -}}
{{- end -}}
{{- end -}}
{{- /* NOTE: use string length as uint to substitute string concatination/slicing for add/sub */ -}}
{{- /* initialize memory pointer (use length as ptr address) */ -}}
{{- $memoryPtr := "" -}}
{{- /* initialize position in source code where parser reads (use length as position) */ -}}
{{- $parsingBytePos := "" -}}
{{- /* initialize position in stdin to read (use length as position) */ -}}
{{- $readingStdinBytePos := "" -}}
{{- /* run interpreter */ -}}
{{- /* NOTE: write processes directly in loop because variables cannot be resolved in template */ -}}
{{- range $Looper -}}
{{- range $Looper -}}
{{- range $Looper -}}
{{- /* NOTE: exists is implemented only in k8s parser */ -}}
{{- if exists $Source (len $parsingBytePos) -}}
{{- $tokenByte := index $Source (len $parsingBytePos) -}}
{{- $token := printf "%c" $tokenByte -}}
{{- if eq $token ">" -}}
{{- /* increment ptr (or do nothing if ptr reaches max limit) */ -}}
{{if exists $memory (len $memoryPtr)}}
{{- $memoryPtr = print $memoryPtr " " -}}
{{- end -}}
{{- else if eq $token "<" -}}
{{- /* decrement ptr (or do nothing if ptr reaches min limit) */ -}}
{{- $memoryPtr = slice $memoryPtr 1 -}}
{{- else if eq $token "+" -}}
{{- /* increment value referred by memoryPtr */ -}}
{{- $currentValue := index $memory (len $memoryPtr) -}}
{{- $incrementedValue := 0 -}}
{{- if eq $currentValue 255 -}}
{{- $incrementedValue = 0 -}}
{{- else if eq $currentValue 0 -}}
{{- $incrementedValue = 1 -}}
{{- else -}}
{{- /* len $valueLengthStr == $currentValue */ -}}
{{- $valueLengthStr := printf (print "%0" $currentValue "d") 0 -}}
{{- $incrementedValue = len (print $valueLengthStr " ") -}}
{{- end -}}
{{- /* replace only referred byte */ -}}
{{- $former := slice $memory 0 (len $memoryPtr) -}}
{{- $latter := slice $memory (len (print $memoryPtr " ")) -}}
{{- $memory = print $former (printf "%c" $incrementedValue) $latter -}}
{{- else if eq $token "-" -}}
{{- /* decrement value referred by memoryPtr */ -}}
{{- $currentValue := index $memory (len $memoryPtr) -}}
{{- $decrementedValue := 0 -}}
{{- if eq $currentValue 0 -}}
{{- $decrementedValue = 255 -}}
{{- else -}}
{{- /* len $valueLengthStr == $currentValue */ -}}
{{- $valueLengthStr := printf (print "%0" $currentValue "d") 0 -}}
{{- $decrementedValue = len (slice $valueLengthStr 1) -}}
{{- end -}}
{{- /* replace only referred byte */ -}}
{{- $former := slice $memory 0 (len $memoryPtr) -}}
{{- $latter := slice $memory (len (print $memoryPtr " ")) -}}
{{- $memory = print $former (printf "%c" $decrementedValue) $latter -}}
{{- else if eq $token "." -}}
{{- /* output value referred by memoryPtr */ -}}
{{- printf "%c" (index $memory (len $memoryPtr)) -}}
{{- else if eq $token "," -}}
{{- /* copy byte in stdin to address memoryPtr refers */ -}}
{{- if exists $Stdin (len $readingStdinBytePos) -}}
{{- $stdinByte := index $Stdin (len $readingStdinBytePos) -}}
{{- /* replace only referred byte */ -}}
{{- $former := slice $memory 0 (len $memoryPtr) -}}
{{- $latter := slice $memory (len (print $memoryPtr " ")) -}}
{{- $memory = print $former (printf "%c" $stdinByte) $latter -}}
{{- end -}}
{{- else if eq $token "[" -}}
{{- /* preceed parsingBytePos to next "]" if value referred by memeoryPtr is 0 */ -}}
{{- $currentValue := index $memory (len $memoryPtr) -}}
{{- if eq $currentValue 0 -}}
{{- range $Looper -}}
{{- range $Looper -}}
{{- if or (ne $token "]") (exists $Source (len (print $parsingBytePos " "))) -}}
{{- /* increment parsingBytePos */ -}}
{{- $parsingBytePos = print $parsingBytePos " " -}}
{{- /* update token */ -}}
{{- $tokenByte = index $Source (len $parsingBytePos) -}}
{{- $token = printf "%c" $tokenByte -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- else if eq $token "]" -}}
{{- /* get parsingBytePos back to last `[` if value referred by memeoryPtr is not 0 */ -}}
{{- $currentValue := index $memory (len $memoryPtr) -}}
{{- if ne $currentValue 0 -}}
{{- range $Looper -}}
{{- range $Looper -}}
{{- if or (ne $token "[") (lt (len $parsingBytePos) 0) -}}
{{- /* decrement parsingBytePos */ -}}
{{- $parsingBytePos = slice $parsingBytePos 1 -}}
{{- /* update token */ -}}
{{- $tokenByte = index $Source (len $parsingBytePos) -}}
{{- $token = printf "%c" $tokenByte -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- /* increment pos */ -}}
{{- $parsingBytePos = print $parsingBytePos " " -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- end -}}