Skip to content

Commit be542c2

Browse files
authored
Merge pull request #1435 from lark-parser/issue1434
Bugfix for issue #1434
2 parents 5016894 + 7547758 commit be542c2

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

lark/parsers/grammar_analysis.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from collections import Counter, defaultdict
44
from typing import List, Dict, Iterator, FrozenSet, Set
55

6-
from ..utils import bfs, fzset, classify
6+
from ..utils import bfs, fzset, classify, OrderedSet
77
from ..exceptions import GrammarError
88
from ..grammar import Rule, Terminal, NonTerminal, Symbol
99
from ..common import ParserConf
@@ -177,13 +177,13 @@ def __init__(self, parser_conf: ParserConf, debug: bool=False, strict: bool=Fals
177177

178178
self.FIRST, self.FOLLOW, self.NULLABLE = calculate_sets(rules)
179179

180-
def expand_rule(self, source_rule: NonTerminal, rules_by_origin=None) -> State:
180+
def expand_rule(self, source_rule: NonTerminal, rules_by_origin=None) -> OrderedSet[RulePtr]:
181181
"Returns all init_ptrs accessible by rule (recursive)"
182182

183183
if rules_by_origin is None:
184184
rules_by_origin = self.rules_by_origin
185185

186-
init_ptrs = set()
186+
init_ptrs = OrderedSet[RulePtr]()
187187
def _expand_rule(rule: NonTerminal) -> Iterator[NonTerminal]:
188188
assert not rule.is_term, rule
189189

@@ -200,4 +200,4 @@ def _expand_rule(rule: NonTerminal) -> Iterator[NonTerminal]:
200200
for _ in bfs([source_rule], _expand_rule):
201201
pass
202202

203-
return fzset(init_ptrs)
203+
return init_ptrs

lark/utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,3 +341,6 @@ def __bool__(self):
341341

342342
def __len__(self) -> int:
343343
return len(self.d)
344+
345+
def __repr__(self):
346+
return f"{type(self).__name__}({', '.join(map(repr,self))})"

tests/test_parser.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -975,6 +975,19 @@ def test_resolve_ambiguity_with_shared_node2(self):
975975
tree = l.parse("")
976976
self.assertEqual(tree, Tree('start', [Tree('x', [])]))
977977

978+
979+
def test_consistent_derivation_order1(self):
980+
# Should return the same result for any hash-seed
981+
parser = Lark('''
982+
start: a a
983+
a: "." | b
984+
b: "."
985+
''', lexer=LEXER)
986+
987+
tree = parser.parse('..')
988+
n = Tree('a', [Tree('b', [])])
989+
assert tree == Tree('start', [n, n])
990+
978991
_NAME = "TestFullEarley" + LEXER.capitalize()
979992
_TestFullEarley.__name__ = _NAME
980993
globals()[_NAME] = _TestFullEarley

0 commit comments

Comments
 (0)