diff options
Diffstat (limited to 'Tools/peg_generator/pegen/grammar_parser.py')
| -rw-r--r-- | Tools/peg_generator/pegen/grammar_parser.py | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/Tools/peg_generator/pegen/grammar_parser.py b/Tools/peg_generator/pegen/grammar_parser.py index 6e3bc5068f..fde0145ee8 100644 --- a/Tools/peg_generator/pegen/grammar_parser.py +++ b/Tools/peg_generator/pegen/grammar_parser.py @@ -13,6 +13,7 @@ from ast import literal_eval from pegen.grammar import ( Alt, Cut, + Forced, Gather, Group, Item, @@ -402,7 +403,7 @@ class GeneratedParser(Parser): @memoize def named_item(self) -> Optional[NamedItem]: - # named_item: NAME '[' NAME '*' ']' '=' ~ item | NAME '[' NAME ']' '=' ~ item | NAME '=' ~ item | item | lookahead + # named_item: NAME '[' NAME '*' ']' '=' ~ item | NAME '[' NAME ']' '=' ~ item | NAME '=' ~ item | item | forced_atom | lookahead mark = self.mark() cut = False if ( @@ -466,6 +467,13 @@ class GeneratedParser(Parser): if cut: return None cut = False if ( + (it := self.forced_atom()) + ): + return NamedItem ( None , it ) + self.reset(mark) + if cut: return None + cut = False + if ( (it := self.lookahead()) ): return NamedItem ( None , it ) @@ -474,6 +482,25 @@ class GeneratedParser(Parser): return None @memoize + def forced_atom(self) -> Optional[NamedItem]: + # forced_atom: '&' '&' ~ atom + mark = self.mark() + cut = False + if ( + (literal := self.expect('&')) + and + (literal_1 := self.expect('&')) + and + (cut := True) + and + (atom := self.atom()) + ): + return Forced ( atom ) + self.reset(mark) + if cut: return None + return None + + @memoize def lookahead(self) -> Optional[LookaheadOrCut]: # lookahead: '&' ~ atom | '!' ~ atom | '~' mark = self.mark() |
