Allow the generator to be a little more declarative
This commit is contained in:
parent
e203e27407
commit
03937e62e6
2 changed files with 16 additions and 4 deletions
|
|
@ -54,10 +54,11 @@ RSQUARE = Terminal("RightBracket")
|
||||||
|
|
||||||
|
|
||||||
class FineGrammar(Grammar):
|
class FineGrammar(Grammar):
|
||||||
|
generator = GenerateLALR
|
||||||
|
start = "File"
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__(
|
super().__init__(
|
||||||
start="File",
|
|
||||||
precedence=[
|
precedence=[
|
||||||
(Assoc.RIGHT, [EQUAL]),
|
(Assoc.RIGHT, [EQUAL]),
|
||||||
(Assoc.LEFT, [OR]),
|
(Assoc.LEFT, [OR]),
|
||||||
|
|
@ -81,7 +82,6 @@ class FineGrammar(Grammar):
|
||||||
#
|
#
|
||||||
(Assoc.NONE, [self.is_expression]),
|
(Assoc.NONE, [self.is_expression]),
|
||||||
],
|
],
|
||||||
generator=GenerateLALR,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@rule("File")
|
@rule("File")
|
||||||
|
|
|
||||||
16
parser.py
16
parser.py
|
|
@ -1854,14 +1854,26 @@ class Grammar:
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
start: str,
|
start: str | None = None,
|
||||||
precedence: PrecedenceList | None = None,
|
precedence: PrecedenceList | None = None,
|
||||||
generator: type[GenerateLR0] = GenerateLALR,
|
generator: type[GenerateLR0] | None = None,
|
||||||
):
|
):
|
||||||
|
if start is None:
|
||||||
|
start = getattr(self, "start", None)
|
||||||
|
if start is None:
|
||||||
|
raise ValueError(
|
||||||
|
"The default start rule must either be specified in the constructor or as an "
|
||||||
|
"attribute in the class."
|
||||||
|
)
|
||||||
|
|
||||||
if precedence is None:
|
if precedence is None:
|
||||||
precedence = getattr(self, "precedence", [])
|
precedence = getattr(self, "precedence", [])
|
||||||
assert precedence is not None
|
assert precedence is not None
|
||||||
|
|
||||||
|
if generator is None:
|
||||||
|
generator = getattr(self, "generator", GenerateLALR)
|
||||||
|
assert generator is not None
|
||||||
|
|
||||||
precedence_table = {}
|
precedence_table = {}
|
||||||
for prec, (associativity, symbols) in enumerate(precedence):
|
for prec, (associativity, symbols) in enumerate(precedence):
|
||||||
for symbol in symbols:
|
for symbol in symbols:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue