Grammars can be named

This commit is contained in:
John Doty 2024-08-29 08:00:40 -07:00
parent abcb0e516a
commit dc03bf7373
2 changed files with 53 additions and 0 deletions

View file

@ -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]:

View file

@ -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"