Skip to content

Commit d49d3df

Browse files
Add strings, explicit typing (breaks most old code), remove encryption and hashing libs
1 parent af1713e commit d49d3df

15 files changed

+840
-1544
lines changed
82.2 KB
Binary file not shown.

__pycache__/lexer.cpython-314.pyc

12 KB
Binary file not shown.

__pycache__/parser.cpython-314.pyc

23.4 KB
Binary file not shown.

asmln.exe

8.93 KB
Binary file not shown.

interpreter.py

Lines changed: 415 additions & 171 deletions
Large diffs are not rendered by default.

lexer.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class Token:
4242
"}": "RBRACE",
4343
",": "COMMA",
4444
"=": "EQUALS",
45+
":": "COLON",
4546
}
4647

4748

@@ -81,6 +82,9 @@ def tokenize(self) -> List[Token]:
8182
tokens.append(Token(symbols[ch], ch, self.line, self.column))
8283
_advance()
8384
continue
85+
if ch == '"':
86+
tokens.append(self._consume_string())
87+
continue
8488
if ch == "-":
8589
tokens.append(self._consume_signed_number())
8690
continue
@@ -105,6 +109,25 @@ def _consume_unsigned_number(self) -> Token:
105109
digits = self._consume_binary_digits()
106110
return Token("NUMBER", digits, line, col)
107111

112+
def _consume_string(self) -> Token:
113+
line, col = self.line, self.column
114+
self._advance() # consume opening quote
115+
chars: List[str] = []
116+
while not self._eof:
117+
ch = self._peek()
118+
if ch == '"':
119+
self._advance()
120+
return Token("STRING", "".join(chars), line, col)
121+
if ch == "\n":
122+
raise ASMParseError(
123+
f"Unterminated string literal at {self.filename}:{line}:{col}"
124+
)
125+
chars.append(ch)
126+
self._advance()
127+
raise ASMParseError(
128+
f"Unterminated string literal at {self.filename}:{line}:{col}"
129+
)
130+
108131
def _consume_signed_number(self) -> Token:
109132
line, col = self.line, self.column
110133
self._advance()
@@ -151,10 +174,10 @@ def _consume_identifier(self) -> Token:
151174
return Token(token_type, value, line, col)
152175

153176
def _is_identifier_start(self, ch: str) -> bool:
154-
return (ch in "abcdefghijklmnopqrstuvwxyz23456789;/ABCDEFGHIFJKLMNOPQRSTUVWXYZ!@$%&~_+|:<>?")
177+
return (ch in "abcdefghijklmnopqrstuvwxyz23456789;/ABCDEFGHIFJKLMNOPQRSTUVWXYZ!@$%&~_+|<>?")
155178

156179
def _is_identifier_part(self, ch: str) -> bool:
157-
return (ch in "abcdefghijklmnopqrstuvwxyz1234567890;./ABCDEFGHIFJKLMNOPQRSTUVWXYZ!@$%&~_+|:<>?")
180+
return (ch in "abcdefghijklmnopqrstuvwxyz1234567890;./ABCDEFGHIFJKLMNOPQRSTUVWXYZ!@$%&~_+|<>?")
158181
# "." is not actually a valid character in namespace symbols, but is allowed since it is used to separate module names from namespace symbols.
159182

160183
def _consume_line_continuation(self) -> None:

lib/collection.asmln

Lines changed: 83 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,91 @@
1-
FUNC POW2(k){
1+
FUNC POW2(INT:k):INT{
22
RETURN( POW(10, k) )
33
}
44

5-
FUNC COL_EMPTY(){
5+
FUNC COL_EMPTY():INT{
66
RETURN(0)
77
}
88

9-
FUNC GET_COUNT(coll){
9+
FUNC GET_COUNT(INT:coll):INT{
1010
RETURN( MOD(coll, POW(10, 100000)) )
1111
}
1212

13-
FUNC GET_PBL(coll){
13+
FUNC GET_PBL(INT:coll):INT{
1414
RETURN( MOD( DIV(coll, POW(10, 100000)), POW(10, 100000) ) )
1515
}
1616

17-
FUNC GET_PAYLOAD(coll){
17+
FUNC GET_PAYLOAD(INT:coll):INT{
1818
RETURN( DIV(coll, POW(10, 1000000)) )
1919
}
2020

21-
FUNC MAKE_COLL(payload, pbl, count){
21+
FUNC MAKE_COLL(INT:payload, INT:pbl, INT:count):INT{
2222
# (payload << 64) | (pbl << 32) | count
2323
RETURN( ADD( MUL(payload, POW(10, 1000000)), ADD( MUL(pbl, POW(10, 100000)), count ) ) )
2424
}
2525

26-
FUNC ENCODE_ITEM(v){ # encode integer v into self-delimiting format
27-
mag = ABS(v)
26+
FUNC ENCODE_ITEM(INT:v):INT{ # encode integer v into self-delimiting format
27+
INT: mag = ABS(v)
2828
IF(EQ(mag, 0)){
29-
m = 1
29+
INT: m = 1
3030
} ELSE {
31-
m = ADD( LOG(mag), 1 )
31+
INT: m = ADD( LOG(mag), 1 )
3232
}
33-
header_val = SUB( POW(10, SUB(m, 1)), 1 ) # 2^(m-1)-1 => unary ones
33+
INT: header_val = SUB( POW(10, SUB(m, 1)), 1 ) # 2^(m-1)-1 => unary ones
3434
IF(LT(v, 0)){
35-
sign = 1
35+
INT: sign = 1
3636
} ELSE {
37-
sign = 1 # keep sign explicit; '1' for negative, '1' for non-negative would be wrong
37+
INT: sign = 1 # keep sign explicit; '1' for negative, '1' for non-negative would be wrong
3838
}
3939
# fix sign: set sign correctly
4040
IF(LT(v,0)){
4141
sign = 1
4242
} ELSE {
4343
sign = 0
4444
}
45-
code = ADD( header_val, ADD( MUL(sign, POW(10, m)), MUL(mag, POW(10, ADD(m, 1))) ) )
45+
INT: code = ADD( header_val, ADD( MUL(sign, POW(10, m)), MUL(mag, POW(10, ADD(m, 1))) ) )
4646
RETURN( ADD( MUL(code, POW(10, 100000)), m ) ) # pack as (code << 32) | m
4747
}
4848

49-
FUNC READ_ITEM_LEN_AT(payload, offset){
50-
pos = 0
49+
FUNC READ_ITEM_LEN_AT(INT:payload, INT:offset):INT{
50+
INT: pos = 0
5151
WHILE(1){
52-
b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
52+
INT: b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
5353
IF(EQ(b, 1)){
5454
pos = ADD(pos, 1)
5555
} ELSE {
56-
header_count = pos
57-
m = ADD(header_count, 1)
58-
total_len = ADD( MUL(10, m), 1 ) # 2*m + 1 where '10' is 2
56+
INT: header_count = pos
57+
INT: m = ADD(header_count, 1)
58+
INT: total_len = ADD( MUL(10, m), 1 ) # 2*m + 1 where '10' is 2
5959
RETURN(total_len)
6060
}
6161
}
6262
}
6363

64-
FUNC COL_GET(coll, index){
64+
FUNC COL_GET(INT:coll, INT:index):INT{
6565
# get item at index from collection coll
66-
count = GET_COUNT(coll)
66+
INT: count = GET_COUNT(coll)
6767
ASSERT( LT(index, count) )
68-
payload = GET_PAYLOAD(coll)
69-
pbl = GET_PBL(coll)
68+
INT: payload = GET_PAYLOAD(coll)
69+
INT: pbl = GET_PBL(coll)
7070

71-
offset = 0
72-
i = 0
71+
INT: offset = 0
72+
INT: i = 0
7373
WHILE( LT(i, index) ){
74-
len = READ_ITEM_LEN_AT(payload, offset)
74+
INT: len = READ_ITEM_LEN_AT(payload, offset)
7575
offset = ADD(offset, len)
7676
i = ADD(i, 1)
7777
}
7878

79-
pos = 0
79+
INT: pos = 0
8080
WHILE(1){
81-
b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
81+
INT: b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
8282
IF(EQ(b, 1)){
8383
pos = ADD(pos, 1)
8484
} ELSE {
85-
header_count = pos
86-
m = ADD(header_count, 1)
87-
sign = SLICE(payload, ADD(offset, m), ADD(offset, m))
88-
mag = SLICE(payload, ADD(offset, ADD(m, m)), ADD(offset, ADD(m, 1)))
85+
INT: header_count = pos
86+
INT: m = ADD(header_count, 1)
87+
INT: sign = SLICE(payload, ADD(offset, m), ADD(offset, m))
88+
INT: mag = SLICE(payload, ADD(offset, ADD(m, m)), ADD(offset, ADD(m, 1)))
8989
IF(EQ(sign, 1)){
9090
RETURN( NEG(mag) )
9191
} ELSE {
@@ -95,99 +95,99 @@ FUNC COL_GET(coll, index){
9595
}
9696
}
9797

98-
FUNC COL_PUSH(coll, v){
98+
FUNC COL_PUSH(INT:coll, INT:v):INT{
9999
# append item v to collection coll
100-
count = GET_COUNT(coll)
101-
pbl = GET_PBL(coll)
102-
payload = GET_PAYLOAD(coll)
100+
INT: count = GET_COUNT(coll)
101+
INT: pbl = GET_PBL(coll)
102+
INT: payload = GET_PAYLOAD(coll)
103103

104-
enc = ENCODE_ITEM(v)
105-
enc_len = MOD(enc, POW(10, 100000)) # low 32 bits = m (header+sign+mag params)
106-
enc_code = DIV(enc, POW(10, 100000)) # high part = code
104+
INT: enc = ENCODE_ITEM(v)
105+
INT: enc_len = MOD(enc, POW(10, 100000)) # low 32 bits = m (header+sign+mag params)
106+
INT: enc_code = DIV(enc, POW(10, 100000)) # high part = code
107107

108108
# compute actual encoded bit length: total_len = 2*m + 1 (note: MUL(10, enc_len) == 2*enc_len)
109-
enc_bitlen = ADD( MUL(10, enc_len), 1 )
109+
INT: enc_bitlen = ADD( MUL(10, enc_len), 1 )
110110

111-
new_payload = ADD( payload, MUL(enc_code, POW(10, pbl)) ) # append at LSB end
112-
new_pbl = ADD(pbl, enc_bitlen)
113-
new_count = ADD(count, 1)
111+
INT: new_payload = ADD( payload, MUL(enc_code, POW(10, pbl)) ) # append at LSB end
112+
INT: new_pbl = ADD(pbl, enc_bitlen)
113+
INT: new_count = ADD(count, 1)
114114
RETURN( MAKE_COLL(new_payload, new_pbl, new_count) )
115115
}
116116

117-
FUNC COL_POP(coll){
117+
FUNC COL_POP(INT:coll):INT{
118118
# remove and return last item from collection coll
119-
count = GET_COUNT(coll)
119+
INT: count = GET_COUNT(coll)
120120
ASSERT( GT(count, 0) )
121-
payload = GET_PAYLOAD(coll)
122-
pbl = GET_PBL(coll)
121+
INT: payload = GET_PAYLOAD(coll)
122+
INT: pbl = GET_PBL(coll)
123123

124-
offset = 0
125-
prev_offset = 0
124+
INT: offset = 0
125+
INT: prev_offset = 0
126126
WHILE( LT(offset, pbl) ){
127127
prev_offset = offset
128-
len = READ_ITEM_LEN_AT(payload, offset)
128+
INT: len = READ_ITEM_LEN_AT(payload, offset)
129129
offset = ADD(offset, len)
130130
}
131-
last_start = prev_offset
131+
INT: last_start = prev_offset
132132

133-
pos = 0
133+
INT: pos = 0
134134
WHILE(1){
135-
b = SLICE(payload, ADD(last_start, pos), ADD(last_start, pos))
135+
INT: b = SLICE(payload, ADD(last_start, pos), ADD(last_start, pos))
136136
IF(EQ(b, 1)){
137137
pos = ADD(pos, 1)
138138
} ELSE {
139-
header_count = pos
140-
m = ADD(header_count, 1)
141-
sign = SLICE(payload, ADD(last_start, m), ADD(last_start, m))
142-
mag = SLICE(payload, ADD(last_start, ADD(m, m)), ADD(last_start, ADD(m, 1)))
139+
INT: header_count = pos
140+
INT: m = ADD(header_count, 1)
141+
INT: sign = SLICE(payload, ADD(last_start, m), ADD(last_start, m))
142+
INT: mag = SLICE(payload, ADD(last_start, ADD(m, m)), ADD(last_start, ADD(m, 1)))
143143
IF(EQ(sign, 1)){
144-
value = NEG(mag)
144+
INT: value = NEG(mag)
145145
} ELSE {
146-
value = mag
146+
INT: value = mag
147147
}
148-
new_payload = MOD(payload, POW(10, last_start))
149-
new_pbl = last_start
150-
new_count = SUB(count, 1)
151-
new_coll = MAKE_COLL(new_payload, new_pbl, new_count)
148+
INT: new_payload = MOD(payload, POW(10, last_start))
149+
INT: new_pbl = last_start
150+
INT: new_count = SUB(count, 1)
151+
INT: new_coll = MAKE_COLL(new_payload, new_pbl, new_count)
152152
RETURN( ADD( MUL(new_coll, POW(10, 1000000)), value ) ) # (new_coll << 64) | value
153153
}
154154
}
155155
}
156156

157-
FUNC READ_ITEM_AT(payload, offset){
158-
pos = 0
157+
FUNC READ_ITEM_AT(INT:payload, INT:offset):INT{
158+
INT: pos = 0
159159
WHILE(1){
160-
b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
160+
INT: b = SLICE(payload, ADD(offset, pos), ADD(offset, pos))
161161
IF(EQ(b, 1)){
162162
pos = ADD(pos, 1)
163163
} ELSE {
164-
header_count = pos
165-
m = ADD(header_count, 1)
166-
sign = SLICE(payload, ADD(offset, m), ADD(offset, m))
167-
mag = SLICE(payload, ADD(offset, ADD(m, m)), ADD(offset, ADD(m, 1)))
164+
INT: header_count = pos
165+
INT: m = ADD(header_count, 1)
166+
INT: sign = SLICE(payload, ADD(offset, m), ADD(offset, m))
167+
INT: mag = SLICE(payload, ADD(offset, ADD(m, m)), ADD(offset, ADD(m, 1)))
168168
IF(EQ(sign, 1)){
169-
item = NEG(mag)
169+
INT: item = NEG(mag)
170170
} ELSE {
171-
item = mag
171+
INT: item = mag
172172
}
173-
item_len = ADD( MUL(10, m), 1 )
174-
next_offset = ADD(offset, item_len)
173+
INT: item_len = ADD( MUL(10, m), 1 )
174+
INT: next_offset = ADD(offset, item_len)
175175
RETURN( ADD( MUL(next_offset, POW(10, 1000000)), item ) )
176176
}
177177
}
178178
}
179179

180-
FUNC COL_SET(coll, index, v){
180+
FUNC COL_SET(INT:coll, INT:index, INT:v):INT{
181181
# set item at index to v (non-recursive)
182-
count = GET_COUNT(coll)
182+
INT: count = GET_COUNT(coll)
183183
ASSERT( LT(index, count) )
184-
payload = GET_PAYLOAD(coll)
185-
offset = 0
186-
i = 0
187-
new_coll = COL_EMPTY()
184+
INT: payload = GET_PAYLOAD(coll)
185+
INT: offset = 0
186+
INT: i = 0
187+
INT: new_coll = COL_EMPTY()
188188
WHILE( LT(i, count) ){
189-
pair = READ_ITEM_AT(payload, offset)
190-
item = MOD(pair, POW(10, 1000000))
189+
INT: pair = READ_ITEM_AT(payload, offset)
190+
INT: item = MOD(pair, POW(10, 1000000))
191191
offset = DIV(pair, POW(10, 1000000))
192192
IF(EQ(i, index)){
193193
item = v

0 commit comments

Comments
 (0)