annotate bin/gs2c.py @ 10843:2d5ba2d44680

<Jafet> le/rn double dactyl//Curious spurious verse form, ostensibly catchy to hear but herculean to write. Sadly its bent on the sesquipedalian makes double dactyls pretentious and trite.
author HackBot
date Fri, 28 Apr 2017 02:49:16 +0000
parents c989a1669243
children c9f5afad5250
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 = {}
c989a1669243 <fizzie> revert 58b9ee8f97a7
HackBot
parents:
diff changeset
13 with open('bin/gs2.py') as f:
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()))