1 | #!/usr/bin/env python
|
2 | from __future__ import print_function
|
3 | """
|
4 | asdl_demo.py
|
5 | """
|
6 |
|
7 | import sys
|
8 | from asdl import asdl_ as asdl
|
9 | from asdl import arith_parse
|
10 | from asdl import py_meta
|
11 | from asdl import encode
|
12 | from asdl import format as fmt
|
13 |
|
14 | from osh.meta import Id
|
15 | from core import util
|
16 |
|
17 | log = util.log
|
18 |
|
19 |
|
20 | def main(argv):
|
21 | try:
|
22 | action = argv[1]
|
23 | except IndexError:
|
24 | raise RuntimeError('Action required')
|
25 |
|
26 | if action == 'py': # Prints the module
|
27 | schema_path = argv[2]
|
28 |
|
29 | with open(schema_path) as f:
|
30 | module = asdl.parse(f)
|
31 |
|
32 | app_types = {'id': asdl.UserType(Id)}
|
33 | type_lookup = asdl.ResolveTypes(module, app_types)
|
34 |
|
35 | # Note this is a big tree. But we really want a graph of pointers to
|
36 | # instances.
|
37 | # Type(name, Product(...))
|
38 | # Type(name, Sum([Constructor(...), ...]))
|
39 | #print(module)
|
40 |
|
41 | root = sys.modules[__name__]
|
42 | # NOTE: We shouldn't pass in app_types for arith.asdl, but this is just a
|
43 | # demo.
|
44 | py_meta.MakeTypes(module, root, type_lookup)
|
45 |
|
46 | log('Dynamically created a Python module with these types:')
|
47 | for name in dir(root):
|
48 | print('\t' + name)
|
49 |
|
50 | elif action == 'arith-encode': # oheap encoding
|
51 | expr = argv[2]
|
52 | out_path = argv[3]
|
53 |
|
54 | obj = arith_parse.ParseShell(expr)
|
55 | print('Encoding %r into binary:' % expr)
|
56 | print(obj)
|
57 |
|
58 | enc = encode.Params()
|
59 | with open(out_path, 'wb') as f:
|
60 | out = encode.BinOutput(f)
|
61 | encode.EncodeRoot(obj, enc, out)
|
62 |
|
63 | elif action == 'arith-format': # pretty printing
|
64 | expr = argv[2]
|
65 |
|
66 | obj = arith_parse.ParseShell(expr)
|
67 | #out = fmt.TextOutput(sys.stdout)
|
68 | tree = fmt.MakeTree(obj)
|
69 | #treee= ['hi', 'there', ['a', 'b'], 'c']
|
70 | f = fmt.DetectConsoleOutput(sys.stdout)
|
71 | fmt.PrintTree(tree, f)
|
72 | print()
|
73 |
|
74 | # Might need to print the output?
|
75 | # out.WriteToFile?
|
76 |
|
77 | else:
|
78 | raise RuntimeError('Invalid action %r' % action)
|
79 |
|
80 |
|
81 | if __name__ == '__main__':
|
82 | try:
|
83 | main(sys.argv)
|
84 | except RuntimeError as e:
|
85 | print('FATAL: %r' % e, file=sys.stderr)
|
86 | sys.exit(1)
|