| #!/usr/bin/env python3.8 | |
| # @generated by pegen from metagrammar.gram | |
| import ast | |
| import sys | |
| import tokenize | |
| from typing import Any, Optional | |
| from pegen.parser import memoize, memoize_left_rec, logger, Parser | |
| from ast import literal_eval | |
| from pegen.grammar import ( | |
| Alt, | |
| Cut, | |
| Forced, | |
| Gather, | |
| Group, | |
| Item, | |
| Lookahead, | |
| LookaheadOrCut, | |
| MetaTuple, | |
| MetaList, | |
| NameLeaf, | |
| NamedItem, | |
| NamedItemList, | |
| NegativeLookahead, | |
| Opt, | |
| Plain, | |
| PositiveLookahead, | |
| Repeat0, | |
| Repeat1, | |
| Rhs, | |
| Rule, | |
| RuleList, | |
| RuleName, | |
| Grammar, | |
| StringLeaf, | |
| ) | |
| # Keywords and soft keywords are listed at the end of the parser definition. | |
| class GeneratedParser(Parser): | |
| @memoize | |
| def start(self) -> Optional[Grammar]: | |
| # start: grammar $ | |
| mark = self._mark() | |
| if ( | |
| (grammar := self.grammar()) | |
| and | |
| (_endmarker := self.expect('ENDMARKER')) | |
| ): | |
| return grammar | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def grammar(self) -> Optional[Grammar]: | |
| # grammar: metas rules | rules | |
| mark = self._mark() | |
| if ( | |
| (metas := self.metas()) | |
| and | |
| (rules := self.rules()) | |
| ): | |
| return Grammar ( rules , metas ) | |
| self._reset(mark) | |
| if ( | |
| (rules := self.rules()) | |
| ): | |
| return Grammar ( rules , [] ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def metas(self) -> Optional[MetaList]: | |
| # metas: meta metas | meta | |
| mark = self._mark() | |
| if ( | |
| (meta := self.meta()) | |
| and | |
| (metas := self.metas()) | |
| ): | |
| return [meta] + metas | |
| self._reset(mark) | |
| if ( | |
| (meta := self.meta()) | |
| ): | |
| return [meta] | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def meta(self) -> Optional[MetaTuple]: | |
| # meta: "@" NAME NEWLINE | "@" NAME NAME NEWLINE | "@" NAME STRING NEWLINE | |
| mark = self._mark() | |
| if ( | |
| (literal := self.expect("@")) | |
| and | |
| (name := self.name()) | |
| and | |
| (_newline := self.expect('NEWLINE')) | |
| ): | |
| return ( name . string , None ) | |
| self._reset(mark) | |
| if ( | |
| (literal := self.expect("@")) | |
| and | |
| (a := self.name()) | |
| and | |
| (b := self.name()) | |
| and | |
| (_newline := self.expect('NEWLINE')) | |
| ): | |
| return ( a . string , b . string ) | |
| self._reset(mark) | |
| if ( | |
| (literal := self.expect("@")) | |
| and | |
| (name := self.name()) | |
| and | |
| (string := self.string()) | |
| and | |
| (_newline := self.expect('NEWLINE')) | |
| ): | |
| return ( name . string , literal_eval ( string . string ) ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def rules(self) -> Optional[RuleList]: | |
| # rules: rule rules | rule | |
| mark = self._mark() | |
| if ( | |
| (rule := self.rule()) | |
| and | |
| (rules := self.rules()) | |
| ): | |
| return [rule] + rules | |
| self._reset(mark) | |
| if ( | |
| (rule := self.rule()) | |
| ): | |
| return [rule] | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def rule(self) -> Optional[Rule]: | |
| # rule: rulename flags? ":" alts NEWLINE INDENT more_alts DEDENT | rulename flags? ":" NEWLINE INDENT more_alts DEDENT | rulename flags? ":" alts NEWLINE | |
| mark = self._mark() | |
| if ( | |
| (rulename := self.rulename()) | |
| and | |
| (flags := self.flags(),) | |
| and | |
| (literal := self.expect(":")) | |
| and | |
| (alts := self.alts()) | |
| and | |
| (_newline := self.expect('NEWLINE')) | |
| and | |
| (_indent := self.expect('INDENT')) | |
| and | |
| (more_alts := self.more_alts()) | |
| and | |
| (_dedent := self.expect('DEDENT')) | |
| ): | |
| return Rule ( rulename [0] , rulename [1] , Rhs ( alts . alts + more_alts . alts ) , flags = flags ) | |
| self._reset(mark) | |
| if ( | |
| (rulename := self.rulename()) | |
| and | |
| (flags := self.flags(),) | |
| and | |
| (literal := self.expect(":")) | |
| and | |
| (_newline := self.expect('NEWLINE')) | |
| and | |
| (_indent := self.expect('INDENT')) | |
| and | |
| (more_alts := self.more_alts()) | |
| and | |
| (_dedent := self.expect('DEDENT')) | |
| ): | |
| return Rule ( rulename [0] , rulename [1] , more_alts , flags = flags ) | |
| self._reset(mark) | |
| if ( | |
| (rulename := self.rulename()) | |
| and | |
| (flags := self.flags(),) | |
| and | |
| (literal := self.expect(":")) | |
| and | |
| (alts := self.alts()) | |
| and | |
| (_newline := self.expect('NEWLINE')) | |
| ): | |
| return Rule ( rulename [0] , rulename [1] , alts , flags = flags ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def rulename(self) -> Optional[RuleName]: | |
| # rulename: NAME annotation | NAME | |
| mark = self._mark() | |
| if ( | |
| (name := self.name()) | |
| and | |
| (annotation := self.annotation()) | |
| ): | |
| return ( name . string , annotation ) | |
| self._reset(mark) | |
| if ( | |
| (name := self.name()) | |
| ): | |
| return ( name . string , None ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def flags(self) -> Optional[frozenset [str]]: | |
| # flags: '(' ','.flag+ ')' | |
| mark = self._mark() | |
| if ( | |
| (literal := self.expect('(')) | |
| and | |
| (a := self._gather_2()) | |
| and | |
| (literal_1 := self.expect(')')) | |
| ): | |
| return frozenset ( a ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def flag(self) -> Optional[str]: | |
| # flag: NAME | |
| mark = self._mark() | |
| if ( | |
| (name := self.name()) | |
| ): | |
| return name . string | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def alts(self) -> Optional[Rhs]: | |
| # alts: alt "|" alts | alt | |
| mark = self._mark() | |
| if ( | |
| (alt := self.alt()) | |
| and | |
| (literal := self.expect("|")) | |
| and | |
| (alts := self.alts()) | |
| ): | |
| return Rhs ( [alt] + alts . alts ) | |
| self._reset(mark) | |
| if ( | |
| (alt := self.alt()) | |
| ): | |
| return Rhs ( [alt] ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def more_alts(self) -> Optional[Rhs]: | |
| # more_alts: "|" alts NEWLINE more_alts | "|" alts NEWLINE | |
| mark = self._mark() | |
| if ( | |
| (literal := self.expect("|")) | |
| and | |
| (alts := self.alts()) | |
| and | |
| (_newline := self.expect('NEWLINE')) | |
| and | |
| (more_alts := self.more_alts()) | |
| ): | |
| return Rhs ( alts . alts + more_alts . alts ) | |
| self._reset(mark) | |
| if ( | |
| (literal := self.expect("|")) | |
| and | |
| (alts := self.alts()) | |
| and | |
| (_newline := self.expect('NEWLINE')) | |
| ): | |
| return Rhs ( alts . alts ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def alt(self) -> Optional[Alt]: | |
| # alt: items '$' action | items '$' | items action | items | |
| mark = self._mark() | |
| if ( | |
| (items := self.items()) | |
| and | |
| (literal := self.expect('$')) | |
| and | |
| (action := self.action()) | |
| ): | |
| return Alt ( items + [NamedItem ( None , NameLeaf ( 'ENDMARKER' ) )] , action = action ) | |
| self._reset(mark) | |
| if ( | |
| (items := self.items()) | |
| and | |
| (literal := self.expect('$')) | |
| ): | |
| return Alt ( items + [NamedItem ( None , NameLeaf ( 'ENDMARKER' ) )] , action = None ) | |
| self._reset(mark) | |
| if ( | |
| (items := self.items()) | |
| and | |
| (action := self.action()) | |
| ): | |
| return Alt ( items , action = action ) | |
| self._reset(mark) | |
| if ( | |
| (items := self.items()) | |
| ): | |
| return Alt ( items , action = None ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def items(self) -> Optional[NamedItemList]: | |
| # items: named_item items | named_item | |
| mark = self._mark() | |
| if ( | |
| (named_item := self.named_item()) | |
| and | |
| (items := self.items()) | |
| ): | |
| return [named_item] + items | |
| self._reset(mark) | |
| if ( | |
| (named_item := self.named_item()) | |
| ): | |
| return [named_item] | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def named_item(self) -> Optional[NamedItem]: | |
| # named_item: NAME annotation '=' ~ item | NAME '=' ~ item | item | forced_atom | lookahead | |
| mark = self._mark() | |
| cut = False | |
| if ( | |
| (name := self.name()) | |
| and | |
| (annotation := self.annotation()) | |
| and | |
| (literal := self.expect('=')) | |
| and | |
| (cut := True) | |
| and | |
| (item := self.item()) | |
| ): | |
| return NamedItem ( name . string , item , annotation ) | |
| self._reset(mark) | |
| if cut: return None | |
| cut = False | |
| if ( | |
| (name := self.name()) | |
| and | |
| (literal := self.expect('=')) | |
| and | |
| (cut := True) | |
| and | |
| (item := self.item()) | |
| ): | |
| return NamedItem ( name . string , item ) | |
| self._reset(mark) | |
| if cut: return None | |
| if ( | |
| (item := self.item()) | |
| ): | |
| return NamedItem ( None , item ) | |
| self._reset(mark) | |
| if ( | |
| (forced := self.forced_atom()) | |
| ): | |
| return NamedItem ( None , forced ) | |
| self._reset(mark) | |
| if ( | |
| (it := self.lookahead()) | |
| ): | |
| return NamedItem ( None , it ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def forced_atom(self) -> Optional[Forced]: | |
| # 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() | |
| cut = False | |
| if ( | |
| (literal := self.expect('&')) | |
| and | |
| (cut := True) | |
| and | |
| (atom := self.atom()) | |
| ): | |
| return PositiveLookahead ( atom ) | |
| self._reset(mark) | |
| if cut: return None | |
| cut = False | |
| if ( | |
| (literal := self.expect('!')) | |
| and | |
| (cut := True) | |
| and | |
| (atom := self.atom()) | |
| ): | |
| return NegativeLookahead ( atom ) | |
| self._reset(mark) | |
| if cut: return None | |
| if ( | |
| (literal := self.expect('~')) | |
| ): | |
| return Cut ( ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def item(self) -> Optional[Item]: | |
| # item: '[' ~ alts ']' | atom '?' | atom '*' | atom '+' | atom '.' atom '+' | atom | |
| mark = self._mark() | |
| cut = False | |
| if ( | |
| (literal := self.expect('[')) | |
| and | |
| (cut := True) | |
| and | |
| (alts := self.alts()) | |
| and | |
| (literal_1 := self.expect(']')) | |
| ): | |
| return Opt ( alts ) | |
| self._reset(mark) | |
| if cut: return None | |
| if ( | |
| (atom := self.atom()) | |
| and | |
| (literal := self.expect('?')) | |
| ): | |
| return Opt ( atom ) | |
| self._reset(mark) | |
| if ( | |
| (atom := self.atom()) | |
| and | |
| (literal := self.expect('*')) | |
| ): | |
| return Repeat0 ( atom ) | |
| self._reset(mark) | |
| if ( | |
| (atom := self.atom()) | |
| and | |
| (literal := self.expect('+')) | |
| ): | |
| return Repeat1 ( atom ) | |
| self._reset(mark) | |
| if ( | |
| (sep := self.atom()) | |
| and | |
| (literal := self.expect('.')) | |
| and | |
| (node := self.atom()) | |
| and | |
| (literal_1 := self.expect('+')) | |
| ): | |
| return Gather ( sep , node ) | |
| self._reset(mark) | |
| if ( | |
| (atom := self.atom()) | |
| ): | |
| return atom | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def atom(self) -> Optional[Plain]: | |
| # atom: '(' ~ alts ')' | NAME | STRING | |
| mark = self._mark() | |
| cut = False | |
| if ( | |
| (literal := self.expect('(')) | |
| and | |
| (cut := True) | |
| and | |
| (alts := self.alts()) | |
| and | |
| (literal_1 := self.expect(')')) | |
| ): | |
| return Group ( alts ) | |
| self._reset(mark) | |
| if cut: return None | |
| if ( | |
| (name := self.name()) | |
| ): | |
| return NameLeaf ( name . string ) | |
| self._reset(mark) | |
| if ( | |
| (string := self.string()) | |
| ): | |
| return StringLeaf ( string . string ) | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def action(self) -> Optional[str]: | |
| # action: "{" ~ target_atoms "}" | |
| mark = self._mark() | |
| cut = False | |
| if ( | |
| (literal := self.expect("{")) | |
| and | |
| (cut := True) | |
| and | |
| (target_atoms := self.target_atoms()) | |
| and | |
| (literal_1 := self.expect("}")) | |
| ): | |
| return target_atoms | |
| self._reset(mark) | |
| if cut: return None | |
| return None | |
| @memoize | |
| def annotation(self) -> Optional[str]: | |
| # annotation: "[" ~ target_atoms "]" | |
| mark = self._mark() | |
| cut = False | |
| if ( | |
| (literal := self.expect("[")) | |
| and | |
| (cut := True) | |
| and | |
| (target_atoms := self.target_atoms()) | |
| and | |
| (literal_1 := self.expect("]")) | |
| ): | |
| return target_atoms | |
| self._reset(mark) | |
| if cut: return None | |
| return None | |
| @memoize | |
| def target_atoms(self) -> Optional[str]: | |
| # target_atoms: target_atom target_atoms | target_atom | |
| mark = self._mark() | |
| if ( | |
| (target_atom := self.target_atom()) | |
| and | |
| (target_atoms := self.target_atoms()) | |
| ): | |
| return target_atom + " " + target_atoms | |
| self._reset(mark) | |
| if ( | |
| (target_atom := self.target_atom()) | |
| ): | |
| return target_atom | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def target_atom(self) -> Optional[str]: | |
| # target_atom: "{" ~ target_atoms? "}" | "[" ~ target_atoms? "]" | NAME "*" | NAME | NUMBER | STRING | FSTRING_START | FSTRING_MIDDLE | FSTRING_END | "?" | ":" | !"}" !"]" OP | |
| mark = self._mark() | |
| cut = False | |
| if ( | |
| (literal := self.expect("{")) | |
| and | |
| (cut := True) | |
| and | |
| (atoms := self.target_atoms(),) | |
| and | |
| (literal_1 := self.expect("}")) | |
| ): | |
| return "{" + ( atoms or "" ) + "}" | |
| self._reset(mark) | |
| if cut: return None | |
| cut = False | |
| if ( | |
| (literal := self.expect("[")) | |
| and | |
| (cut := True) | |
| and | |
| (atoms := self.target_atoms(),) | |
| and | |
| (literal_1 := self.expect("]")) | |
| ): | |
| return "[" + ( atoms or "" ) + "]" | |
| self._reset(mark) | |
| if cut: return None | |
| if ( | |
| (name := self.name()) | |
| and | |
| (literal := self.expect("*")) | |
| ): | |
| return name . string + "*" | |
| self._reset(mark) | |
| if ( | |
| (name := self.name()) | |
| ): | |
| return name . string | |
| self._reset(mark) | |
| if ( | |
| (number := self.number()) | |
| ): | |
| return number . string | |
| self._reset(mark) | |
| if ( | |
| (string := self.string()) | |
| ): | |
| return string . string | |
| self._reset(mark) | |
| if ( | |
| (fstring_start := self.fstring_start()) | |
| ): | |
| return fstring_start . string | |
| self._reset(mark) | |
| if ( | |
| (fstring_middle := self.fstring_middle()) | |
| ): | |
| return fstring_middle . string | |
| self._reset(mark) | |
| if ( | |
| (fstring_end := self.fstring_end()) | |
| ): | |
| return fstring_end . string | |
| self._reset(mark) | |
| if ( | |
| (literal := self.expect("?")) | |
| ): | |
| return "?" | |
| self._reset(mark) | |
| if ( | |
| (literal := self.expect(":")) | |
| ): | |
| return ":" | |
| self._reset(mark) | |
| if ( | |
| self.negative_lookahead(self.expect, "}") | |
| and | |
| self.negative_lookahead(self.expect, "]") | |
| and | |
| (op := self.op()) | |
| ): | |
| return op . string | |
| self._reset(mark) | |
| return None | |
| @memoize | |
| def _loop0_1(self) -> Optional[Any]: | |
| # _loop0_1: ',' flag | |
| mark = self._mark() | |
| children = [] | |
| while ( | |
| (literal := self.expect(',')) | |
| and | |
| (elem := self.flag()) | |
| ): | |
| children.append(elem) | |
| mark = self._mark() | |
| self._reset(mark) | |
| return children | |
| @memoize | |
| def _gather_2(self) -> Optional[Any]: | |
| # _gather_2: flag _loop0_1 | |
| mark = self._mark() | |
| if ( | |
| (elem := self.flag()) | |
| is not None | |
| and | |
| (seq := self._loop0_1()) | |
| is not None | |
| ): | |
| return [elem] + seq | |
| self._reset(mark) | |
| return None | |
| KEYWORDS = () | |
| SOFT_KEYWORDS = () | |
| if __name__ == '__main__': | |
| from pegen.parser import simple_parser_main | |
| simple_parser_main(GeneratedParser) |