Coverage for kye/parser/parser.py: 58%
31 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-13 15:17 -0700
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-13 15:17 -0700
1from lark import Lark
2from pathlib import Path
3from kye.parser.kye_transformer import TreeToKye
4from kye.parser.assign_scopes import assign_scopes, Scope
5from kye.parser.assign_type_refs import assign_type_refs
6from kye.parser.flatten_ast import flatten_ast
7from kye.dataset import Models
9DIR = Path(__file__).parent
11with open(DIR / 'grammar.lark') as f:
12 grammar = f.read()
14GLOBAL_SCOPE = Scope(name=None, parent=None)
15for global_type in Models.globals.keys():
16 GLOBAL_SCOPE[global_type] = '<built-in type>'
18parser = Lark(
19 grammar,
20 start='start',
21 parser='lalr',
22 strict=True,
23 propagate_positions=True
24)
26transformer = TreeToKye()
28def print_ast(ast):
29 FORMAT = '{:<20} {:<20} {}'
30 print(FORMAT.format('Scope', 'Type', 'Node'))
31 print('-'*80)
32 for path, node in ast.traverse():
33 print(FORMAT.format(
34 getattr(node.scope, 'path', '') or '',
35 node.type_ref or '',
36 ' '*(len(path)-1) + repr(node))
37 )
39def kye_to_ast(text):
40 tree = parser.parse(text)
41 ast = transformer.transform(tree)
42 assign_scopes(ast, scope=GLOBAL_SCOPE)
43 assign_type_refs(ast)
44 return ast
46def compile(text):
47 ast = kye_to_ast(text)
48 raw_models = flatten_ast(ast)
49 return raw_models