annotate bin/gs2c.py @ 12256:821155c00e34 draft

<fizzie> ` sed -e \'s|wisdom|bin|\' < ../bin/culprits > ../bin/cblprits; chmod a+x ../bin/cblprits
author HackEso <hackeso@esolangs.org>
date Sat, 07 Dec 2019 23:36:22 +0000
parents c9f5afad5250
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9075
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
1 # gs2 compiler (version 0.2)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
2 # (c) nooodl 2014
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
3
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
4 import re
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
5 import struct
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
6 import sys
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
7
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
8 if sys.platform == "win32":
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
9 import os, msvcrt
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
10 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
11
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
12 mnemonics = {}
12097
c9f5afad5250 <fizzie> sled /hackenv/bin/gs2c.py//s|bin/gs2.py|/hackenv/bin/gs2.py|
HackEso <hackeso@esolangs.org>
parents: 9075
diff changeset
13 with open('/hackenv/bin/gs2.py') as f:
9075
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
14 for line in f:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
15 if '#=' in line:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
16 a, b = line.split('#=')
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
17 a = re.findall(r'\\x(..)', a.strip())
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
18 b = b.strip().split(', ')
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
19 assert len(a) == len(b)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
20 for i, j in zip(a, b):
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
21 for k in j.split():
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
22 mnemonics[k] = chr(int(i, 16))
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
23
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
24 mnemonics["'"] = '\xe0' # block1
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
25
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
26 for i in xrange(16):
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
27 mnemonics['@%d' % i] = chr(0xA0 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
28 mnemonics['junk%d' % i] = chr(0xA0 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
29 for i, c in enumerate('abcd'):
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
30 mnemonics['save-%s' % c] = chr(0xC8 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
31 mnemonics['pop-%s' % c] = chr(0xCC | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
32 mnemonics['push-%s' % c] = chr(0xD0 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
33 mnemonics['nip-%s' % c] = chr(0xD4 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
34 mnemonics['tuck-%s' % c] = chr(0xD8 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
35 mnemonics['show-%s' % c] = chr(0xDC | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
36 for i in xrange(8):
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
37 mnemonics['b%d' % (i+1)] = chr(0xE0 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
38 mnemonics['block%d' % (i+1)] = chr(0xE0 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
39 mnemonics['m%d' % (i+1)] = chr(0xE8 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
40 mnemonics['map%d' % (i+1)] = chr(0xE8 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
41 mnemonics['f%d' % (i+1)] = chr(0xF0 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
42 mnemonics['filter%d' % (i+1)] = chr(0xF0 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
43 if 0xF8 | i < 0xFD:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
44 mnemonics['t%d' % (i+1)] = chr(0xF8 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
45 mnemonics['both%d' % (i+1)] = chr(0xF8 | i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
46
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
47 def compile_num(i):
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
48 if 0 <= i <= 10:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
49 return chr(i + 0x10)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
50 elif i == 100:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
51 return '\x1b'
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
52 elif i == 1000:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
53 return '\x1c'
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
54 elif i == 16:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
55 return '\x1d'
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
56 elif i == 64:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
57 return '\x1e'
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
58 elif i == 256:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
59 return '\x1f'
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
60
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
61 elif 0x00 <= i <= 0xFF:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
62 return '\x01' + struct.pack('B', i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
63 elif -0x8000 <= i <= 0x7FFF:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
64 return '\x02' + struct.pack('<h', i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
65 elif -0x80000000 <= i <= 0x7FFFFFFF:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
66 return '\x03' + struct.pack('<l', i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
67 else:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
68 raise Exception("couldn't compile number: %s" % i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
69
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
70 def compile_gs2(s):
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
71 s = '\n'.join(l for l in s.split('\n') if l and l[0] != '#')
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
72 tokens = re.findall(r'"[^"]*"|\S+', s)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
73 string_mode = False
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
74 string_array = False
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
75 strings = []
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
76 output_code = []
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
77
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
78 for i in tokens:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
79 # sys.stderr.write('[%s]\n' % i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
80 try:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
81 v = compile_num(int(i))
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
82 output_code.append(v)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
83 continue
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
84 except ValueError: pass
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
85
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
86 if i[0] == "'" and len(i) > 1:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
87 v = compile_num(ord(i[1]))
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
88 output_code.append(v)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
89 elif i == ')':
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
90 string_mode = False
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
91 s_open = '\x04'
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
92 s_close = {
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
93 'regular': '\x05',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
94 'array': '\x06',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
95 'printf': '\x9b',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
96 'regex-match': '\x9c',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
97 'regex-sub': '\x9d',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
98 'regex-find': '\x9e',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
99 'regex-split': '\x9f',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
100 }[string_type]
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
101 if len(strings) == 1 and len(strings[0]) == 1:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
102 output_code.append('\x07' + strings[0])
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
103 else:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
104 output_code.append(s_open + '\x07'.join(strings) + s_close)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
105 elif string_mode or i[0] == '"':
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
106 if i[0] == '"':
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
107 if string_mode:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
108 strings.append(eval(i))
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
109 elif len(eval(i)) == 1:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
110 output_code.append('\x07' + eval(i))
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
111 else:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
112 output_code.append('\x04' + eval(i) + '\x05')
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
113 else:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
114 strings.append(i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
115 elif i in ['(', 'w(', 'p(', 'm(', 's(', 'f(', 'v(']:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
116 string_mode = True
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
117 string_type = {
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
118 '(': 'regular',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
119 'w(': 'array',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
120 'p(': 'printf',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
121 'm(': 'regex-match',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
122 's(': 'regex-sub',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
123 'f(': 'regex-find',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
124 'v(': 'regex-split',
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
125 }[i]
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
126 strings = []
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
127 elif i.lower() in mnemonics:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
128 output_code.append(mnemonics[i.lower()])
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
129 else:
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
130 raise Exception('unknown symbol: ' + i)
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
131 # shortcut: strip leading \x04
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
132 return ''.join(output_code).lstrip('\x04')
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
133
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
134 if __name__ == '__main__':
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
135 sys.stdout.write(compile_gs2(sys.stdin.read()))