cpython/Tools/peg_generator/pegen/grammar_parser.py

656 lines
17 KiB
Python
Raw Normal View History

#!/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 memoflag? ":" alts NEWLINE INDENT more_alts DEDENT | rulename memoflag? ":" NEWLINE INDENT more_alts DEDENT | rulename memoflag? ":" alts NEWLINE
mark = self._mark()
if (
(rulename := self.rulename())
and
(opt := self.memoflag(),)
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 ) , memo = opt )
self._reset(mark)
if (
(rulename := self.rulename())
and
(opt := self.memoflag(),)
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 , memo = opt )
self._reset(mark)
if (
(rulename := self.rulename())
and
(opt := self.memoflag(),)
and
(literal := self.expect(":"))
and
(alts := self.alts())
and
(_newline := self.expect('NEWLINE'))
):
return Rule ( rulename [0] , rulename [1] , alts , memo = opt )
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 memoflag(self) -> Optional[str]:
# memoflag: '(' "memo" ')'
mark = self._mark()
if (
(literal := self.expect('('))
and
(literal_1 := self.expect("memo"))
and
(literal_2 := self.expect(')'))
):
return "memo"
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 | "?" | ":" | !"}" !"]" 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 (
(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
KEYWORDS = ()
SOFT_KEYWORDS = ('memo',)
if __name__ == '__main__':
from pegen.parser import simple_parser_main
simple_parser_main(GeneratedParser)