From dc03bf7373948680aee906ccc78a21b716c7c549 Mon Sep 17 00:00:00 2001 From: John Doty Date: Thu, 29 Aug 2024 08:00:40 -0700 Subject: [PATCH] Grammars can be named --- parser/parser.py | 7 +++++++ tests/test_grammar.py | 46 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/parser/parser.py b/parser/parser.py index 34d3233..bdc0349 100644 --- a/parser/parser.py +++ b/parser/parser.py @@ -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]: diff --git a/tests/test_grammar.py b/tests/test_grammar.py index cc33145..f3c1f85 100644 --- a/tests/test_grammar.py +++ b/tests/test_grammar.py @@ -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"