Move error recovery function.

This commit is contained in:
Dave Halter
2014-11-02 17:24:06 +01:00
parent 0c3cba166e
commit 1ff4713848
4 changed files with 52 additions and 37 deletions

View File

@@ -60,7 +60,8 @@ class Parser(object):
self.used_names = {}
self.scope_names_stack = [{}]
logger = logging.getLogger("Jedi-Parser")
d = Driver(pytree.python_grammar, convert=self.convert, logger=logger)
d = Driver(pytree.python_grammar, self.convert,
self.error_recovery, logger=logger)
self.module = d.parse_string(source).get_parent_until()
self.module.used_names = self.used_names
@@ -96,6 +97,37 @@ class Parser(object):
new_node.names_dict = scope_names
return new_node
def error_recovery(self, grammar, stack, type, value):
"""
This parser is written in a dynamic way, meaning that this parser
allows using different grammars (even non-Python). However, error
recovery is purely written for Python.
"""
if value == '\n': # Statement is not finished.
# Now remove the whole statement.
for i, (dfa, state, node) in reversed(list(enumerate(stack))):
symbol, _, _, _ = node
# `suite` can sometimes be only simple_stmt, not stmt.
if symbol in (grammar.symbol2number['simple_stmt'],
grammar.symbol2number['stmt']):
index = i
stack[index:] = []
else:
# For now just discard everything that is not a suite or
# file_input, if we detect an error.
for i, (dfa, state, node) in reversed(list(enumerate(stack))):
symbol, _, _, _ = node
# `suite` can sometimes be only simple_stmt, not stmt.
if symbol in (grammar.symbol2number['file_input'],
grammar.symbol2number['suite']):
index = i
break
stack[index + 1:] = []
# No success finding a transition
#raise ParseError("bad input", type, value, context)
def __init__old__(self, source, module_path=None, no_docstr=False,
tokenizer=None, top_module=None):
self.no_docstr = no_docstr