From 03937e62e61d7da1f3d41a3f58c3def033391be4 Mon Sep 17 00:00:00 2001 From: John Doty Date: Sat, 1 Jun 2024 05:57:16 -0700 Subject: [PATCH] Allow the generator to be a little more declarative --- grammar.py | 4 ++-- parser.py | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/grammar.py b/grammar.py index 1801bfd..1ecf61f 100644 --- a/grammar.py +++ b/grammar.py @@ -54,10 +54,11 @@ RSQUARE = Terminal("RightBracket") class FineGrammar(Grammar): + generator = GenerateLALR + start = "File" def __init__(self): super().__init__( - start="File", precedence=[ (Assoc.RIGHT, [EQUAL]), (Assoc.LEFT, [OR]), @@ -81,7 +82,6 @@ class FineGrammar(Grammar): # (Assoc.NONE, [self.is_expression]), ], - generator=GenerateLALR, ) @rule("File") diff --git a/parser.py b/parser.py index 813d91d..4ad5683 100644 --- a/parser.py +++ b/parser.py @@ -1854,14 +1854,26 @@ class Grammar: def __init__( self, - start: str, + start: str | 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: precedence = getattr(self, "precedence", []) assert precedence is not None + if generator is None: + generator = getattr(self, "generator", GenerateLALR) + assert generator is not None + precedence_table = {} for prec, (associativity, symbols) in enumerate(precedence): for symbol in symbols: