Coverage for src/lumen/fhirpath/parser/__init__.py: 96%

28 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-08-31 18:46 +0000

1import sys 

2from antlr4 import * 

3from antlr4.tree.Tree import ParseTreeWalker 

4from antlr4.error.ErrorListener import ErrorListener 

5from antlr4.error.Errors import LexerNoViableAltException 

6from lumen.fhirpath.parser.generated.FHIRPathLexer import FHIRPathLexer 

7from lumen.fhirpath.parser.generated.FHIRPathParser import FHIRPathParser 

8from lumen.fhirpath.parser.ASTPathListener import ASTPathListener 

9 

10 

11class _ThrowingErrorListener(ErrorListener): 

12 def syntaxError(self, recognizer, offending_symbol, line, column, msg, e): # type: ignore[override] 

13 raise SyntaxError(f"line {line}:{column} {msg}") 

14 

15 

16def recover(e): 

17 raise e 

18 

19 

20def parse(value): 

21 textStream = InputStream(value) 

22 

23 astPathListener = ASTPathListener() 

24 error_listener = _ThrowingErrorListener() 

25 

26 lexer = FHIRPathLexer(textStream) 

27 lexer.recover = recover 

28 lexer.removeErrorListeners() 

29 lexer.addErrorListener(error_listener) 

30 

31 parser = FHIRPathParser(CommonTokenStream(lexer)) 

32 parser.buildParseTrees = True 

33 parser.removeErrorListeners() 

34 parser.addErrorListener(error_listener) 

35 

36 walker = ParseTreeWalker() 

37 walker.walk(astPathListener, parser.expression()) 

38 

39 return astPathListener.parentStack[0]