Grammars can be named
This commit is contained in:
parent
abcb0e516a
commit
dc03bf7373
2 changed files with 53 additions and 0 deletions
|
|
@ -1824,6 +1824,7 @@ class Grammar:
|
|||
precedence: PrecedenceList | None = None,
|
||||
generator: type[GenerateLR0] | None = None,
|
||||
trivia: list[str | Terminal] | None = None,
|
||||
name: str | None = None,
|
||||
):
|
||||
if start is None:
|
||||
start = getattr(self, "start", None)
|
||||
|
|
@ -1879,11 +1880,17 @@ class Grammar:
|
|||
|
||||
precedence_table[key] = (associativity, prec + 1)
|
||||
|
||||
if name is None:
|
||||
name = getattr(self, "name", None)
|
||||
if name is None:
|
||||
name = self.__class__.__name__.removesuffix("Grammar").lower()
|
||||
|
||||
self._precedence = precedence_table
|
||||
self._start = start
|
||||
self._generator = generator
|
||||
self._terminals = list(terminals.values())
|
||||
self._trivia = resolved_trivia
|
||||
self.name = name
|
||||
|
||||
@property
|
||||
def terminals(self) -> list[Terminal]:
|
||||
|
|
|
|||
|
|
@ -364,3 +364,49 @@ def test_grammar_trivia_constructor_string_unknown():
|
|||
|
||||
with pytest.raises(ValueError):
|
||||
G().build_table()
|
||||
|
||||
|
||||
def test_grammar_name_implicit():
|
||||
class FooGrammar(Grammar):
|
||||
start = "x"
|
||||
|
||||
@rule
|
||||
def x(self):
|
||||
return self.WORD
|
||||
|
||||
WORD = Terminal("blah")
|
||||
|
||||
assert FooGrammar().name == "foo"
|
||||
|
||||
|
||||
def test_grammar_name_explicit_member():
|
||||
class FooGrammar(Grammar):
|
||||
start = "x"
|
||||
|
||||
name = "bar"
|
||||
|
||||
@rule
|
||||
def x(self):
|
||||
return self.WORD
|
||||
|
||||
WORD = Terminal("blah")
|
||||
|
||||
assert FooGrammar().name == "bar"
|
||||
|
||||
|
||||
def test_grammar_name_explicit_constructor():
|
||||
class FooGrammar(Grammar):
|
||||
start = "x"
|
||||
|
||||
name = "bar"
|
||||
|
||||
def __init__(self):
|
||||
super().__init__(name="baz")
|
||||
|
||||
@rule
|
||||
def x(self):
|
||||
return self.WORD
|
||||
|
||||
WORD = Terminal("blah")
|
||||
|
||||
assert FooGrammar().name == "baz"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue