mirror of
https://github.com/davidhalter/jedi.git
synced 2026-02-25 06:37:12 +08:00
Introduce error recovery for the parser: At the moment just recover from broken statements.
This commit is contained in:
@@ -144,8 +144,7 @@ class Parser(object):
|
|||||||
raise ParseError("too much input",
|
raise ParseError("too much input",
|
||||||
type, value, context)
|
type, value, context)
|
||||||
else:
|
else:
|
||||||
# No success finding a transition
|
self.error_recovery(type, value, context)
|
||||||
raise ParseError("bad input", type, value, context)
|
|
||||||
|
|
||||||
def classify(self, type, value, context):
|
def classify(self, type, value, context):
|
||||||
"""Turn a token into a label. (Internal)"""
|
"""Turn a token into a label. (Internal)"""
|
||||||
@@ -188,3 +187,25 @@ class Parser(object):
|
|||||||
else:
|
else:
|
||||||
self.rootnode = newnode
|
self.rootnode = newnode
|
||||||
self.rootnode.used_names = self.used_names
|
self.rootnode.used_names = self.used_names
|
||||||
|
|
||||||
|
def error_recovery(self, type, value, context):
|
||||||
|
"""
|
||||||
|
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.
|
||||||
|
"""
|
||||||
|
print(self.stack)
|
||||||
|
#import pdb; pdb.set_trace()
|
||||||
|
if value == '\n': # Statement is not finished.
|
||||||
|
# Now remove the whole statement.
|
||||||
|
for i, (dfa, state, node) in reversed(list(enumerate(self.stack))):
|
||||||
|
symbol, _, _, _ = node
|
||||||
|
|
||||||
|
# `suite` can sometimes be only simple_stmt, not stmt.
|
||||||
|
if symbol in (self.grammar.symbol2number['simple_stmt'],
|
||||||
|
self.grammar.symbol2number['stmt']):
|
||||||
|
index = i
|
||||||
|
self.stack[index:] = []
|
||||||
|
else:
|
||||||
|
# No success finding a transition
|
||||||
|
raise ParseError("bad input", type, value, context)
|
||||||
|
|||||||
Reference in New Issue
Block a user