Path: blob/main/Tools/peg_generator/pegen/grammar_parser.py
12 views
#!/usr/bin/env python3.81# @generated by pegen from metagrammar.gram23import ast4import sys5import tokenize67from typing import Any, Optional89from pegen.parser import memoize, memoize_left_rec, logger, Parser10from ast import literal_eval1112from pegen.grammar import (13Alt,14Cut,15Forced,16Gather,17Group,18Item,19Lookahead,20LookaheadOrCut,21MetaTuple,22MetaList,23NameLeaf,24NamedItem,25NamedItemList,26NegativeLookahead,27Opt,28Plain,29PositiveLookahead,30Repeat0,31Repeat1,32Rhs,33Rule,34RuleList,35RuleName,36Grammar,37StringLeaf,38)3940# Keywords and soft keywords are listed at the end of the parser definition.41class GeneratedParser(Parser):4243@memoize44def start(self) -> Optional[Grammar]:45# start: grammar $46mark = self._mark()47if (48(grammar := self.grammar())49and50(_endmarker := self.expect('ENDMARKER'))51):52return grammar53self._reset(mark)54return None5556@memoize57def grammar(self) -> Optional[Grammar]:58# grammar: metas rules | rules59mark = self._mark()60if (61(metas := self.metas())62and63(rules := self.rules())64):65return Grammar ( rules , metas )66self._reset(mark)67if (68(rules := self.rules())69):70return Grammar ( rules , [] )71self._reset(mark)72return None7374@memoize75def metas(self) -> Optional[MetaList]:76# metas: meta metas | meta77mark = self._mark()78if (79(meta := self.meta())80and81(metas := self.metas())82):83return [meta] + metas84self._reset(mark)85if (86(meta := self.meta())87):88return [meta]89self._reset(mark)90return None9192@memoize93def meta(self) -> Optional[MetaTuple]:94# meta: "@" NAME NEWLINE | "@" NAME NAME NEWLINE | "@" NAME STRING NEWLINE95mark = self._mark()96if (97(literal := self.expect("@"))98and99(name := self.name())100and101(_newline := self.expect('NEWLINE'))102):103return ( name . string , None )104self._reset(mark)105if (106(literal := self.expect("@"))107and108(a := self.name())109and110(b := self.name())111and112(_newline := self.expect('NEWLINE'))113):114return ( a . string , b . string )115self._reset(mark)116if (117(literal := self.expect("@"))118and119(name := self.name())120and121(string := self.string())122and123(_newline := self.expect('NEWLINE'))124):125return ( name . string , literal_eval ( string . string ) )126self._reset(mark)127return None128129@memoize130def rules(self) -> Optional[RuleList]:131# rules: rule rules | rule132mark = self._mark()133if (134(rule := self.rule())135and136(rules := self.rules())137):138return [rule] + rules139self._reset(mark)140if (141(rule := self.rule())142):143return [rule]144self._reset(mark)145return None146147@memoize148def rule(self) -> Optional[Rule]:149# rule: rulename memoflag? ":" alts NEWLINE INDENT more_alts DEDENT | rulename memoflag? ":" NEWLINE INDENT more_alts DEDENT | rulename memoflag? ":" alts NEWLINE150mark = self._mark()151if (152(rulename := self.rulename())153and154(opt := self.memoflag(),)155and156(literal := self.expect(":"))157and158(alts := self.alts())159and160(_newline := self.expect('NEWLINE'))161and162(_indent := self.expect('INDENT'))163and164(more_alts := self.more_alts())165and166(_dedent := self.expect('DEDENT'))167):168return Rule ( rulename [0] , rulename [1] , Rhs ( alts . alts + more_alts . alts ) , memo = opt )169self._reset(mark)170if (171(rulename := self.rulename())172and173(opt := self.memoflag(),)174and175(literal := self.expect(":"))176and177(_newline := self.expect('NEWLINE'))178and179(_indent := self.expect('INDENT'))180and181(more_alts := self.more_alts())182and183(_dedent := self.expect('DEDENT'))184):185return Rule ( rulename [0] , rulename [1] , more_alts , memo = opt )186self._reset(mark)187if (188(rulename := self.rulename())189and190(opt := self.memoflag(),)191and192(literal := self.expect(":"))193and194(alts := self.alts())195and196(_newline := self.expect('NEWLINE'))197):198return Rule ( rulename [0] , rulename [1] , alts , memo = opt )199self._reset(mark)200return None201202@memoize203def rulename(self) -> Optional[RuleName]:204# rulename: NAME annotation | NAME205mark = self._mark()206if (207(name := self.name())208and209(annotation := self.annotation())210):211return ( name . string , annotation )212self._reset(mark)213if (214(name := self.name())215):216return ( name . string , None )217self._reset(mark)218return None219220@memoize221def memoflag(self) -> Optional[str]:222# memoflag: '(' "memo" ')'223mark = self._mark()224if (225(literal := self.expect('('))226and227(literal_1 := self.expect("memo"))228and229(literal_2 := self.expect(')'))230):231return "memo"232self._reset(mark)233return None234235@memoize236def alts(self) -> Optional[Rhs]:237# alts: alt "|" alts | alt238mark = self._mark()239if (240(alt := self.alt())241and242(literal := self.expect("|"))243and244(alts := self.alts())245):246return Rhs ( [alt] + alts . alts )247self._reset(mark)248if (249(alt := self.alt())250):251return Rhs ( [alt] )252self._reset(mark)253return None254255@memoize256def more_alts(self) -> Optional[Rhs]:257# more_alts: "|" alts NEWLINE more_alts | "|" alts NEWLINE258mark = self._mark()259if (260(literal := self.expect("|"))261and262(alts := self.alts())263and264(_newline := self.expect('NEWLINE'))265and266(more_alts := self.more_alts())267):268return Rhs ( alts . alts + more_alts . alts )269self._reset(mark)270if (271(literal := self.expect("|"))272and273(alts := self.alts())274and275(_newline := self.expect('NEWLINE'))276):277return Rhs ( alts . alts )278self._reset(mark)279return None280281@memoize282def alt(self) -> Optional[Alt]:283# alt: items '$' action | items '$' | items action | items284mark = self._mark()285if (286(items := self.items())287and288(literal := self.expect('$'))289and290(action := self.action())291):292return Alt ( items + [NamedItem ( None , NameLeaf ( 'ENDMARKER' ) )] , action = action )293self._reset(mark)294if (295(items := self.items())296and297(literal := self.expect('$'))298):299return Alt ( items + [NamedItem ( None , NameLeaf ( 'ENDMARKER' ) )] , action = None )300self._reset(mark)301if (302(items := self.items())303and304(action := self.action())305):306return Alt ( items , action = action )307self._reset(mark)308if (309(items := self.items())310):311return Alt ( items , action = None )312self._reset(mark)313return None314315@memoize316def items(self) -> Optional[NamedItemList]:317# items: named_item items | named_item318mark = self._mark()319if (320(named_item := self.named_item())321and322(items := self.items())323):324return [named_item] + items325self._reset(mark)326if (327(named_item := self.named_item())328):329return [named_item]330self._reset(mark)331return None332333@memoize334def named_item(self) -> Optional[NamedItem]:335# named_item: NAME annotation '=' ~ item | NAME '=' ~ item | item | forced_atom | lookahead336mark = self._mark()337cut = False338if (339(name := self.name())340and341(annotation := self.annotation())342and343(literal := self.expect('='))344and345(cut := True)346and347(item := self.item())348):349return NamedItem ( name . string , item , annotation )350self._reset(mark)351if cut: return None352cut = False353if (354(name := self.name())355and356(literal := self.expect('='))357and358(cut := True)359and360(item := self.item())361):362return NamedItem ( name . string , item )363self._reset(mark)364if cut: return None365if (366(item := self.item())367):368return NamedItem ( None , item )369self._reset(mark)370if (371(forced := self.forced_atom())372):373return NamedItem ( None , forced )374self._reset(mark)375if (376(it := self.lookahead())377):378return NamedItem ( None , it )379self._reset(mark)380return None381382@memoize383def forced_atom(self) -> Optional[Forced]:384# forced_atom: '&' '&' ~ atom385mark = self._mark()386cut = False387if (388(literal := self.expect('&'))389and390(literal_1 := self.expect('&'))391and392(cut := True)393and394(atom := self.atom())395):396return Forced ( atom )397self._reset(mark)398if cut: return None399return None400401@memoize402def lookahead(self) -> Optional[LookaheadOrCut]:403# lookahead: '&' ~ atom | '!' ~ atom | '~'404mark = self._mark()405cut = False406if (407(literal := self.expect('&'))408and409(cut := True)410and411(atom := self.atom())412):413return PositiveLookahead ( atom )414self._reset(mark)415if cut: return None416cut = False417if (418(literal := self.expect('!'))419and420(cut := True)421and422(atom := self.atom())423):424return NegativeLookahead ( atom )425self._reset(mark)426if cut: return None427if (428(literal := self.expect('~'))429):430return Cut ( )431self._reset(mark)432return None433434@memoize435def item(self) -> Optional[Item]:436# item: '[' ~ alts ']' | atom '?' | atom '*' | atom '+' | atom '.' atom '+' | atom437mark = self._mark()438cut = False439if (440(literal := self.expect('['))441and442(cut := True)443and444(alts := self.alts())445and446(literal_1 := self.expect(']'))447):448return Opt ( alts )449self._reset(mark)450if cut: return None451if (452(atom := self.atom())453and454(literal := self.expect('?'))455):456return Opt ( atom )457self._reset(mark)458if (459(atom := self.atom())460and461(literal := self.expect('*'))462):463return Repeat0 ( atom )464self._reset(mark)465if (466(atom := self.atom())467and468(literal := self.expect('+'))469):470return Repeat1 ( atom )471self._reset(mark)472if (473(sep := self.atom())474and475(literal := self.expect('.'))476and477(node := self.atom())478and479(literal_1 := self.expect('+'))480):481return Gather ( sep , node )482self._reset(mark)483if (484(atom := self.atom())485):486return atom487self._reset(mark)488return None489490@memoize491def atom(self) -> Optional[Plain]:492# atom: '(' ~ alts ')' | NAME | STRING493mark = self._mark()494cut = False495if (496(literal := self.expect('('))497and498(cut := True)499and500(alts := self.alts())501and502(literal_1 := self.expect(')'))503):504return Group ( alts )505self._reset(mark)506if cut: return None507if (508(name := self.name())509):510return NameLeaf ( name . string )511self._reset(mark)512if (513(string := self.string())514):515return StringLeaf ( string . string )516self._reset(mark)517return None518519@memoize520def action(self) -> Optional[str]:521# action: "{" ~ target_atoms "}"522mark = self._mark()523cut = False524if (525(literal := self.expect("{"))526and527(cut := True)528and529(target_atoms := self.target_atoms())530and531(literal_1 := self.expect("}"))532):533return target_atoms534self._reset(mark)535if cut: return None536return None537538@memoize539def annotation(self) -> Optional[str]:540# annotation: "[" ~ target_atoms "]"541mark = self._mark()542cut = False543if (544(literal := self.expect("["))545and546(cut := True)547and548(target_atoms := self.target_atoms())549and550(literal_1 := self.expect("]"))551):552return target_atoms553self._reset(mark)554if cut: return None555return None556557@memoize558def target_atoms(self) -> Optional[str]:559# target_atoms: target_atom target_atoms | target_atom560mark = self._mark()561if (562(target_atom := self.target_atom())563and564(target_atoms := self.target_atoms())565):566return target_atom + " " + target_atoms567self._reset(mark)568if (569(target_atom := self.target_atom())570):571return target_atom572self._reset(mark)573return None574575@memoize576def target_atom(self) -> Optional[str]:577# target_atom: "{" ~ target_atoms? "}" | "[" ~ target_atoms? "]" | NAME "*" | NAME | NUMBER | STRING | "?" | ":" | !"}" !"]" OP578mark = self._mark()579cut = False580if (581(literal := self.expect("{"))582and583(cut := True)584and585(atoms := self.target_atoms(),)586and587(literal_1 := self.expect("}"))588):589return "{" + ( atoms or "" ) + "}"590self._reset(mark)591if cut: return None592cut = False593if (594(literal := self.expect("["))595and596(cut := True)597and598(atoms := self.target_atoms(),)599and600(literal_1 := self.expect("]"))601):602return "[" + ( atoms or "" ) + "]"603self._reset(mark)604if cut: return None605if (606(name := self.name())607and608(literal := self.expect("*"))609):610return name . string + "*"611self._reset(mark)612if (613(name := self.name())614):615return name . string616self._reset(mark)617if (618(number := self.number())619):620return number . string621self._reset(mark)622if (623(string := self.string())624):625return string . string626self._reset(mark)627if (628(literal := self.expect("?"))629):630return "?"631self._reset(mark)632if (633(literal := self.expect(":"))634):635return ":"636self._reset(mark)637if (638self.negative_lookahead(self.expect, "}")639and640self.negative_lookahead(self.expect, "]")641and642(op := self.op())643):644return op . string645self._reset(mark)646return None647648KEYWORDS = ()649SOFT_KEYWORDS = ('memo',)650651652if __name__ == '__main__':653from pegen.parser import simple_parser_main654simple_parser_main(GeneratedParser)655656657