From 52fc8fc5697437f38b8e42d56e624497fc7993c5 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 28 Jun 2018 00:59:55 +0200 Subject: [PATCH] Finish the stack in a way we want to. --- parso/parser.py | 27 ++++++++++++++------------- parso/python/parser.py | 12 +----------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/parso/parser.py b/parso/parser.py index 685c7cb..e33b8fb 100644 --- a/parso/parser.py +++ b/parso/parser.py @@ -130,15 +130,20 @@ class BaseParser(object): for token in tokens: self._add_token(token) - while self.stack and self.stack[-1].dfa.is_final: - self._pop() + while True: + 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: - # 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) - return self.rootnode + if len(self.stack) > 1: + self._pop() + else: + return self.convert_node(tos.nonterminal, tos.nodes) def error_recovery(self, token): if self._error_recovery: @@ -199,8 +204,4 @@ class BaseParser(object): else: new_node = self.convert_node(tos.dfa.from_rule, tos.nodes) - try: - self.stack[-1].nodes.append(new_node) - except IndexError: - # Stack is empty, set the rootnode. - self.rootnode = new_node + self.stack[-1].nodes.append(new_node) diff --git a/parso/python/parser.py b/parso/python/parser.py index 05487b8..9762f54 100644 --- a/parso/python/parser.py +++ b/parso/python/parser.py @@ -89,17 +89,7 @@ class Parser(BaseParser): tokens = self._recovery_tokenize(tokens) - node = 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 + return super(Parser, self).parse(tokens) def convert_node(self, nonterminal, children): """