diff --git a/parso/grammar.py b/parso/grammar.py index e77d83c..caf5001 100644 --- a/parso/grammar.py +++ b/parso/grammar.py @@ -186,7 +186,7 @@ class Grammar(object): return normalizer.issues def __repr__(self): - nonterminals = self._pgen_grammar._nonterminal_to_dfas.keys() + nonterminals = self._pgen_grammar.nonterminal_to_dfas.keys() txt = ' '.join(list(nonterminals)[:3]) + ' ...' return '<%s:%s>' % (self.__class__.__name__, txt) diff --git a/parso/parser.py b/parso/parser.py index b710ed5..859e3f8 100644 --- a/parso/parser.py +++ b/parso/parser.py @@ -152,9 +152,12 @@ class BaseParser(object): def convert_node(self, nonterminal, children): try: - return self.node_map[nonterminal](children) + node = self.node_map[nonterminal](children) except KeyError: - return self.default_node(nonterminal, children) + node = self.default_node(nonterminal, children) + for c in children: + c.parent = node + return node def convert_leaf(self, type_, value, prefix, start_pos): try: diff --git a/parso/python/diff.py b/parso/python/diff.py index 24bc795..3551ee4 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -60,7 +60,7 @@ def _assert_valid_graph(node): assert node.start_pos == actual, (node.start_pos, actual) else: for child in children: - assert child.parent == node + assert child.parent == node, (node, child) _assert_valid_graph(child) diff --git a/parso/python/parser.py b/parso/python/parser.py index 550bc4c..e46b618 100644 --- a/parso/python/parser.py +++ b/parso/python/parser.py @@ -90,7 +90,7 @@ class Parser(BaseParser): strictly bottom-up. """ try: - return self.node_map[nonterminal](children) + node = self.node_map[nonterminal](children) except KeyError: if nonterminal == 'suite': # We don't want the INDENT/DEDENT in our parser tree. Those @@ -104,7 +104,10 @@ class Parser(BaseParser): elif nonterminal == 'listmaker': # Same as list_if above. nonterminal = 'testlist_comp' - return self.default_node(nonterminal, children) + node = self.default_node(nonterminal, children) + for c in children: + c.parent = node + return node def convert_leaf(self, type, value, prefix, start_pos): # print('leaf', repr(value), token.tok_name[type]) @@ -189,7 +192,10 @@ class Parser(BaseParser): all_nodes = [node for stack_node in self.stack[start_index:] for node in stack_node.nodes] if all_nodes: - self.stack[start_index - 1].nodes.append(tree.PythonErrorNode(all_nodes)) + node = tree.PythonErrorNode(all_nodes) + for n in all_nodes: + n.parent = node + self.stack[start_index - 1].nodes.append(node) self.stack[start_index:] = [] return bool(all_nodes) diff --git a/parso/tree.py b/parso/tree.py index 9e7ab2f..9758a82 100644 --- a/parso/tree.py +++ b/parso/tree.py @@ -244,8 +244,6 @@ class BaseNode(NodeOrLeaf): type = None def __init__(self, children): - for c in children: - c.parent = self self.children = children """ A list of :class:`NodeOrLeaf` child nodes.