-
Notifications
You must be signed in to change notification settings - Fork 0
/
unreal.py
41 lines (34 loc) · 1.14 KB
/
unreal.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
"""
Run the interpreter from the command line.
"""
import sys
import interpreter, parser
def main(argv):
defs = sum(map(load, argv[1:]), ())
interpreter.run(defs)
def load(filename):
with open(filename) as f:
text = f.read()
try:
return parser.parse(text)
except parser.Unparsable as e:
syntax_error(e, filename)
sys.exit(1)
def syntax_error(e, filename):
line_no, prefix, suffix = where(e)
prefix, suffix = sanitize(prefix), sanitize(suffix)
sys.stderr.write("%s:%d:%d: Syntax error\n" % (filename, line_no, len(prefix)))
sys.stderr.write(' ' + prefix + suffix + '\n')
sys.stderr.write(' ' + ' '*len(prefix) + '^\n')
def where(e):
before, after = e.failure
line_no = before.count('\n')
prefix = (before+'\n').splitlines()[line_no]
suffix = (after+'\n').splitlines()[0] # XXX what if right on newline?
return line_no+1, prefix, suffix
def sanitize(s):
"Make s predictably printable, sans control characters like tab."
return ''.join(c if ' ' <= c < chr(127) else ' ' # XXX crude
for c in s)
if __name__ == '__main__':
main(sys.argv)