diff --git a/lark/parsers/earley.py b/lark/parsers/earley.py index 0722fec..3c04ac1 100644 --- a/lark/parsers/earley.py +++ b/lark/parsers/earley.py @@ -110,8 +110,9 @@ class Column: if item.is_complete: # XXX Potential bug: What happens if there's ambiguity in an empty rule? - if item.rule.expansion and item in self.completed: - old_tree = self.completed[item].tree + item_key = item, item.tree # Elsewhere, tree is not part of the comparison + if item.rule.expansion and item_key in self.completed: + old_tree = self.completed[item_key].tree if old_tree == item.tree: is_empty = len(self.FIRST[item.rule.origin]) if is_empty: @@ -130,7 +131,7 @@ class Column: old_tree.children.append(item.tree) # old_tree.children.append(item.tree) else: - self.completed[item] = item + self.completed[item_key] = item self.to_reduce.append(item) else: if isinstance(item.expect, Terminal): diff --git a/lark/parsers/xearley.py b/lark/parsers/xearley.py index 9f30b23..693e54f 100644 --- a/lark/parsers/xearley.py +++ b/lark/parsers/xearley.py @@ -51,7 +51,7 @@ class Parser: def parse(self, stream, start_symbol=None): # Define parser functions start_symbol = start_symbol or self.start_symbol - delayed_matches = defaultdict(set) + delayed_matches = defaultdict(list) match_after_ignore = set() text_line = 1 @@ -88,7 +88,7 @@ class Parser: for x in self.ignore: m = x.match(stream, i) if m: - delayed_matches[m.end()] |= set(to_scan) + delayed_matches[m.end()] += set(to_scan) if m.end() == len(stream): match_after_ignore.update(set(column.to_reduce)) @@ -103,13 +103,13 @@ class Parser: m = item.expect.match(stream, i) if m: t = Token(item.expect.name, m.group(0), i, text_line, text_column) - delayed_matches[m.end()].add(item.advance(t)) + delayed_matches[m.end()].append(item.advance(t)) s = m.group(0) for j in range(1, len(s)): m = item.expect.match(s[:-j]) if m: - delayed_matches[m.end()].add(item.advance(m.group(0))) + delayed_matches[m.end()].append(item.advance(m.group(0))) next_set = Column(i+1, self.FIRST) next_set.add(delayed_matches[i+1])