| #!/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) |