OILS / opy / _regtest / src / asdl / asdl_demo.py View on Github | oilshell.org

86 lines, 51 significant
1#!/usr/bin/env python
2from __future__ import print_function
3"""
4asdl_demo.py
5"""
6
7import sys
8from asdl import asdl_ as asdl
9from asdl import arith_parse
10from asdl import py_meta
11from asdl import encode
12from asdl import format as fmt
13
14from osh.meta import Id
15from core import util
16
17log = util.log
18
19
20def 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
81if __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)