-
Notifications
You must be signed in to change notification settings - Fork 0
/
expander_anoky.py
87 lines (68 loc) · 2.52 KB
/
expander_anoky.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
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
import sys
import msgpack
from anoky.common.errors import CompilerError
from anoky.common.record import Record
from anoky.common.old_args_parser import SysArgsParser
#from anoky.parsers.LycParser import LycParser
from anoky.expansion.expander import DefaultExpander
from anoky.parsers.anoky_parser import AnokyParser
from anoky.streams.file_stream import FileStream
from anoky.syntax.lisp_printer import indented_lisp_printer
import anoky.common.options as Options
def unicode_encoder(obj):
return (str(obj)+"\n").encode()
def parse_args(argv):
options = Record({'verbose': False})
args = SysArgsParser(argv)
while args.next() is not None:
arg = args()
if arg == '--verbose':
options.verbose = True
Options.PRINT_TREE_TRANSDUCER_OUTPUTS = True
Options.PRINT_ARRANGEMENT_OUTPUTS = True
elif arg == '--binary':
options.binary = True
options.encoder = msgpack.packb
elif arg == '--lex':
if 'encoder' not in options:
options.binary = False
options.encoder = unicode_encoder
if args.peek() is None or args.peek().startswith("--"):
options.output = sys.stdout.buffer
else:
output_name = args.next()
if output_name == 'stdout': options.output = sys.stdout.buffer
if output_name == 'stderr': options.output = sys.stderr.buffer
else: options.output = open(output_name, "wb")
elif arg.lower().endswith('.aky'):
if 'filename' in options:
print("Multiple filenames found!")
exit(-1)
options['filename'] = arg
else:
print("Unexpected option, '%s'" % arg)
exit(-1)
return options
def expand(options):
parser = AnokyParser()
try:
if "filename" not in options:
print("No filename specified.")
return
filename = options.filename
stream = FileStream(filename)
file_node = parser.parse(stream)
print(indented_lisp_printer(file_node))
expander = DefaultExpander()
ec = expander.expand_unit(file_node)
print("\nAfter macro expansion:")
print(indented_lisp_printer(file_node))
except CompilerError as e:
print(e.trace)
def main():
options = parse_args(sys.argv)
expand(options)
# node = Form(Identifier("bla bla"), Identifier("arg"))
# print(lisp_printer(node))
if __name__ == "__main__":
main()