Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/lark/parsers/earley_common.py: 85%
27 statements
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:30 +0000
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:30 +0000
1"""This module implements useful building blocks for the Earley parser
2"""
5class Item:
6 "An Earley Item, the atom of the algorithm."
8 __slots__ = ('s', 'rule', 'ptr', 'start', 'is_complete', 'expect', 'previous', 'node', '_hash')
9 def __init__(self, rule, ptr, start):
10 self.is_complete = len(rule.expansion) == ptr
11 self.rule = rule # rule
12 self.ptr = ptr # ptr
13 self.start = start # j
14 self.node = None # w
15 if self.is_complete:
16 self.s = rule.origin
17 self.expect = None
18 self.previous = rule.expansion[ptr - 1] if ptr > 0 and len(rule.expansion) else None
19 else:
20 self.s = (rule, ptr)
21 self.expect = rule.expansion[ptr]
22 self.previous = rule.expansion[ptr - 1] if ptr > 0 and len(rule.expansion) else None
23 self._hash = hash((self.s, self.start))
25 def advance(self):
26 return Item(self.rule, self.ptr + 1, self.start)
28 def __eq__(self, other):
29 return self is other or (self.s == other.s and self.start == other.start)
31 def __hash__(self):
32 return self._hash
34 def __repr__(self):
35 before = ( expansion.name for expansion in self.rule.expansion[:self.ptr] )
36 after = ( expansion.name for expansion in self.rule.expansion[self.ptr:] )
37 symbol = "{} ::= {}* {}".format(self.rule.origin.name, ' '.join(before), ' '.join(after))
38 return '%s (%d)' % (symbol, self.start)
41# class TransitiveItem(Item):
42# ... # removed at commit 4c1cfb2faf24e8f8bff7112627a00b94d261b420