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,
|
precedence: PrecedenceList | None = None,
|
||||||
generator: type[GenerateLR0] | None = None,
|
generator: type[GenerateLR0] | None = None,
|
||||||
trivia: list[str | Terminal] | None = None,
|
trivia: list[str | Terminal] | None = None,
|
||||||
|
name: str | None = None,
|
||||||
):
|
):
|
||||||
if start is None:
|
if start is None:
|
||||||
start = getattr(self, "start", None)
|
start = getattr(self, "start", None)
|
||||||
|
|
@ -1879,11 +1880,17 @@ class Grammar:
|
||||||
|
|
||||||
precedence_table[key] = (associativity, prec + 1)
|
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._precedence = precedence_table
|
||||||
self._start = start
|
self._start = start
|
||||||
self._generator = generator
|
self._generator = generator
|
||||||
self._terminals = list(terminals.values())
|
self._terminals = list(terminals.values())
|
||||||
self._trivia = resolved_trivia
|
self._trivia = resolved_trivia
|
||||||
|
self.name = name
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def terminals(self) -> list[Terminal]:
|
def terminals(self) -> list[Terminal]:
|
||||||
|
|
|
||||||
|
|
@ -364,3 +364,49 @@ def test_grammar_trivia_constructor_string_unknown():
|
||||||
|
|
||||||
with pytest.raises(ValueError):
|
with pytest.raises(ValueError):
|
||||||
G().build_table()
|
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