mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Update pegen to use the latest upstream developments (GH-27586)
This commit is contained in:
parent
8e832fb2a2
commit
953d27261e
26 changed files with 1243 additions and 673 deletions
|
@ -1,51 +1,45 @@
|
|||
from typing import Optional
|
||||
|
||||
from pegen import grammar
|
||||
from pegen.grammar import (
|
||||
Alt,
|
||||
Cut,
|
||||
Gather,
|
||||
GrammarVisitor,
|
||||
Group,
|
||||
Lookahead,
|
||||
NamedItem,
|
||||
NameLeaf,
|
||||
NegativeLookahead,
|
||||
Opt,
|
||||
PositiveLookahead,
|
||||
Repeat0,
|
||||
Repeat1,
|
||||
Rhs,
|
||||
Rule,
|
||||
StringLeaf,
|
||||
Rhs,
|
||||
)
|
||||
|
||||
|
||||
class ValidationError(Exception):
|
||||
pass
|
||||
|
||||
class GrammarValidator(GrammarVisitor):
|
||||
def __init__(self, grammar: grammar.Grammar):
|
||||
self.grammar = grammar
|
||||
self.rulename = None
|
||||
|
||||
def validate_rule(self, rulename: str, node: Rule):
|
||||
class GrammarValidator(GrammarVisitor):
|
||||
def __init__(self, grammar: grammar.Grammar) -> None:
|
||||
self.grammar = grammar
|
||||
self.rulename: Optional[str] = None
|
||||
|
||||
def validate_rule(self, rulename: str, node: Rule) -> None:
|
||||
self.rulename = rulename
|
||||
self.visit(node)
|
||||
self.rulename = None
|
||||
|
||||
|
||||
class SubRuleValidator(GrammarValidator):
|
||||
def visit_Rhs(self, node: Rule):
|
||||
def visit_Rhs(self, node: Rhs) -> None:
|
||||
for index, alt in enumerate(node.alts):
|
||||
alts_to_consider = node.alts[index+1:]
|
||||
alts_to_consider = node.alts[index + 1 :]
|
||||
for other_alt in alts_to_consider:
|
||||
self.check_intersection(alt, other_alt)
|
||||
|
||||
def check_intersection(self, first_alt: Alt, second_alt: Alt) -> bool:
|
||||
def check_intersection(self, first_alt: Alt, second_alt: Alt) -> None:
|
||||
if str(second_alt).startswith(str(first_alt)):
|
||||
raise ValidationError(
|
||||
f"In {self.rulename} there is an alternative that will "
|
||||
f"never be visited:\n{second_alt}")
|
||||
f"In {self.rulename} there is an alternative that will "
|
||||
f"never be visited:\n{second_alt}"
|
||||
)
|
||||
|
||||
def validate_grammar(the_grammar: grammar.Grammar):
|
||||
|
||||
def validate_grammar(the_grammar: grammar.Grammar) -> None:
|
||||
for validator_cls in GrammarValidator.__subclasses__():
|
||||
validator = validator_cls(the_grammar)
|
||||
for rule_name, rule in the_grammar.rules.items():
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue