def parse(value: str, parser_rule: str = "configValue", lexer_mode: str = "DEFAULT_MODE") -> ParserRuleContext: """ Parse interpolated string `value` (and return the parse tree). """ l_mode = getattr(OmegaConfGrammarLexer, lexer_mode) istream = InputStream(value) cached = getattr(_grammar_cache, "data", None) if cached is None: error_listener = OmegaConfErrorListener() lexer = OmegaConfGrammarLexer(istream) lexer.removeErrorListeners() lexer.addErrorListener(error_listener) lexer.mode(l_mode) token_stream = CommonTokenStream(lexer) parser = OmegaConfGrammarParser(token_stream) parser.removeErrorListeners() parser.addErrorListener(error_listener) # The two lines below could be enabled in the future if we decide to switch # to SLL prediction mode. Warning though, it has not been fully tested yet! # from antlr4 import PredictionMode # parser._interp.predictionMode = PredictionMode.SLL # Note that although the input stream `istream` is implicitly cached within # the lexer, it will be replaced by a new input next time the lexer is re-used. _grammar_cache.data = lexer, token_stream, parser else: lexer, token_stream, parser = cached # Replace the old input stream with the new one. lexer.inputStream = istream # Initialize the lexer / token stream / parser to process the new input. lexer.mode(l_mode) token_stream.setTokenSource(lexer) parser.reset() try: return getattr(parser, parser_rule)() except Exception as exc: if type(exc) is Exception and str(exc) == "Empty Stack": # This exception is raised by antlr when trying to pop a mode while # no mode has been pushed. We convert it into an `GrammarParseError` # to facilitate exception handling from the caller. raise GrammarParseError("Empty Stack") else: raise
def parse(value: str, parser_rule: str = "configValue", lexer_mode: str = "DEFAULT_MODE") -> ParserRuleContext: """ Parse interpolated string `value` (and return the parse tree). """ global _grammar_cache l_mode = getattr(OmegaConfGrammarLexer, lexer_mode) istream = InputStream(value) if _grammar_cache is None: error_listener = OmegaConfErrorListener() lexer = OmegaConfGrammarLexer(istream) lexer.removeErrorListeners() lexer.addErrorListener(error_listener) lexer.mode(l_mode) tokens = CommonTokenStream(lexer) parser = OmegaConfGrammarParser(tokens) parser.removeErrorListeners() parser.addErrorListener(error_listener) # The two lines below could be enabled in the future if we decide to switch # to SLL prediction mode. Warning though, it has not been fully tested yet! # from antlr4 import PredictionMode # parser._interp.predictionMode = PredictionMode.SLL _grammar_cache = lexer, tokens, parser else: lexer, tokens, parser = _grammar_cache lexer.inputStream = istream lexer.mode(l_mode) tokens.setTokenSource(lexer) parser.reset() try: return getattr(parser, parser_rule)() except Exception as exc: if type(exc) is Exception and str(exc) == "Empty Stack": # This exception is raised by antlr when trying to pop a mode while # no mode has been pushed. We convert it into an `GrammarParseError` # to facilitate exception handling from the caller. raise GrammarParseError("Empty Stack") else: raise