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

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 

8 

9DIR = Path(__file__).parent 

10 

11with open(DIR / 'grammar.lark') as f: 

12 grammar = f.read() 

13 

14GLOBAL_SCOPE = Scope(name=None, parent=None) 

15for global_type in Models.globals.keys(): 

16 GLOBAL_SCOPE[global_type] = '<built-in type>' 

17 

18parser = Lark( 

19 grammar, 

20 start='start', 

21 parser='lalr', 

22 strict=True, 

23 propagate_positions=True 

24) 

25 

26transformer = TreeToKye() 

27 

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 ) 

38 

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 

45 

46def compile(text): 

47 ast = kye_to_ast(text) 

48 raw_models = flatten_ast(ast) 

49 return raw_models