mirror of
https://github.com/davidhalter/parso.git
synced 2026-08-12 19:11:34 +08:00
Finish the stack in a way we want to.
This commit is contained in:
+14
-13
@@ -130,15 +130,20 @@ class BaseParser(object):
|
|||||||
for token in tokens:
|
for token in tokens:
|
||||||
self._add_token(token)
|
self._add_token(token)
|
||||||
|
|
||||||
while self.stack and self.stack[-1].dfa.is_final:
|
while True:
|
||||||
self._pop()
|
tos = self.stack[-1]
|
||||||
|
if not tos.dfa.is_final:
|
||||||
|
# We never broke out -- EOF is too soon -- Unfinished statement.
|
||||||
|
# However, the error recovery might have added the token again, if
|
||||||
|
# the stack is empty, we're fine.
|
||||||
|
raise InternalParseError(
|
||||||
|
"incomplete input", token.type, token.value, token.start_pos
|
||||||
|
)
|
||||||
|
|
||||||
if self.stack:
|
if len(self.stack) > 1:
|
||||||
# We never broke out -- EOF is too soon -- Unfinished statement.
|
self._pop()
|
||||||
# However, the error recovery might have added the token again, if
|
else:
|
||||||
# the stack is empty, we're fine.
|
return self.convert_node(tos.nonterminal, tos.nodes)
|
||||||
raise InternalParseError("incomplete input", token.type, token.value, token.start_pos)
|
|
||||||
return self.rootnode
|
|
||||||
|
|
||||||
def error_recovery(self, token):
|
def error_recovery(self, token):
|
||||||
if self._error_recovery:
|
if self._error_recovery:
|
||||||
@@ -199,8 +204,4 @@ class BaseParser(object):
|
|||||||
else:
|
else:
|
||||||
new_node = self.convert_node(tos.dfa.from_rule, tos.nodes)
|
new_node = self.convert_node(tos.dfa.from_rule, tos.nodes)
|
||||||
|
|
||||||
try:
|
self.stack[-1].nodes.append(new_node)
|
||||||
self.stack[-1].nodes.append(new_node)
|
|
||||||
except IndexError:
|
|
||||||
# Stack is empty, set the rootnode.
|
|
||||||
self.rootnode = new_node
|
|
||||||
|
|||||||
+1
-11
@@ -89,17 +89,7 @@ class Parser(BaseParser):
|
|||||||
|
|
||||||
tokens = self._recovery_tokenize(tokens)
|
tokens = self._recovery_tokenize(tokens)
|
||||||
|
|
||||||
node = super(Parser, self).parse(tokens)
|
return super(Parser, self).parse(tokens)
|
||||||
|
|
||||||
if self._start_nonterminal == 'file_input' != node.type:
|
|
||||||
# If there's only one statement, we get back a non-module. That's
|
|
||||||
# not what we want, we want a module, so we add it here:
|
|
||||||
node = self.convert_node(
|
|
||||||
'file_input',
|
|
||||||
[node]
|
|
||||||
)
|
|
||||||
|
|
||||||
return node
|
|
||||||
|
|
||||||
def convert_node(self, nonterminal, children):
|
def convert_node(self, nonterminal, children):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in New Issue
Block a user