aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/peg_generator/pegen/grammar_parser.py')
-rw-r--r--Tools/peg_generator/pegen/grammar_parser.py677
1 files changed, 677 insertions, 0 deletions
diff --git a/Tools/peg_generator/pegen/grammar_parser.py b/Tools/peg_generator/pegen/grammar_parser.py
new file mode 100644
index 00000000000..0e206ee9cd5
--- /dev/null
+++ b/Tools/peg_generator/pegen/grammar_parser.py
@@ -0,0 +1,677 @@
+#!/usr/bin/env python3.8
+# @generated by pegen from pegen/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,
+ Gather,
+ Group,
+ Item,
+ Lookahead,
+ LookaheadOrCut,
+ MetaTuple,
+ MetaList,
+ NameLeaf,
+ NamedItem,
+ NamedItemList,
+ NegativeLookahead,
+ Opt,
+ Plain,
+ PositiveLookahead,
+ Repeat0,
+ Repeat1,
+ Rhs,
+ Rule,
+ RuleList,
+ RuleName,
+ Grammar,
+ StringLeaf,
+)
+
+class GeneratedParser(Parser):
+
+ @memoize
+ def start(self) -> Optional[Grammar]:
+ # start: grammar $
+ mark = self.mark()
+ cut = False
+ if (
+ (grammar := self.grammar())
+ and
+ (endmarker := self.expect('ENDMARKER'))
+ ):
+ return grammar
+ self.reset(mark)
+ if cut: return None
+ return None
+
+ @memoize
+ def grammar(self) -> Optional[Grammar]:
+ # grammar: metas rules | rules
+ mark = self.mark()
+ cut = False
+ if (
+ (metas := self.metas())
+ and
+ (rules := self.rules())
+ ):
+ return Grammar ( rules , metas )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (rules := self.rules())
+ ):
+ return Grammar ( rules , [ ] )
+ self.reset(mark)
+ if cut: return None
+ return None
+
+ @memoize
+ def metas(self) -> Optional[MetaList]:
+ # metas: meta metas | meta
+ mark = self.mark()
+ cut = False
+ if (
+ (meta := self.meta())
+ and
+ (metas := self.metas())
+ ):
+ return [ meta ] + metas
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (meta := self.meta())
+ ):
+ return [ meta ]
+ self.reset(mark)
+ if cut: return None
+ return None
+
+ @memoize
+ def meta(self) -> Optional[MetaTuple]:
+ # meta: "@" NAME NEWLINE | "@" NAME NAME NEWLINE | "@" NAME STRING NEWLINE
+ mark = self.mark()
+ cut = False
+ if (
+ (literal := self.expect("@"))
+ and
+ (name := self.name())
+ and
+ (newline := self.expect('NEWLINE'))
+ ):
+ return ( name . string , None )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ 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 cut: return None
+ cut = False
+ 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)
+ if cut: return None
+ return None
+
+ @memoize
+ def rules(self) -> Optional[RuleList]:
+ # rules: rule rules | rule
+ mark = self.mark()
+ cut = False
+ if (
+ (rule := self.rule())
+ and
+ (rules := self.rules())
+ ):
+ return [ rule ] + rules
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (rule := self.rule())
+ ):
+ return [ rule ]
+ self.reset(mark)
+ if cut: return None
+ 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()
+ cut = False
+ 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 cut: return None
+ cut = False
+ 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 cut: return None
+ cut = False
+ 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)
+ if cut: return None
+ return None
+
+ @memoize
+ def rulename(self) -> Optional[RuleName]:
+ # rulename: NAME '[' NAME '*' ']' | NAME '[' NAME ']' | NAME
+ mark = self.mark()
+ cut = False
+ if (
+ (name := self.name())
+ and
+ (literal := self.expect('['))
+ and
+ (type := self.name())
+ and
+ (literal_1 := self.expect('*'))
+ and
+ (literal_2 := self.expect(']'))
+ ):
+ return ( name . string , type . string + "*" )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (name := self.name())
+ and
+ (literal := self.expect('['))
+ and
+ (type := self.name())
+ and
+ (literal_1 := self.expect(']'))
+ ):
+ return ( name . string , type . string )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (name := self.name())
+ ):
+ return ( name . string , None )
+ self.reset(mark)
+ if cut: return None
+ return None
+
+ @memoize
+ def memoflag(self) -> Optional[str]:
+ # memoflag: '(' 'memo' ')'
+ mark = self.mark()
+ cut = False
+ if (
+ (literal := self.expect('('))
+ and
+ (literal_1 := self.expect('memo'))
+ and
+ (literal_2 := self.expect(')'))
+ ):
+ return "memo"
+ self.reset(mark)
+ if cut: return None
+ return None
+
+ @memoize
+ def alts(self) -> Optional[Rhs]:
+ # alts: alt "|" alts | alt
+ mark = self.mark()
+ cut = False
+ if (
+ (alt := self.alt())
+ and
+ (literal := self.expect("|"))
+ and
+ (alts := self.alts())
+ ):
+ return Rhs ( [ alt ] + alts . alts )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (alt := self.alt())
+ ):
+ return Rhs ( [ alt ] )
+ self.reset(mark)
+ if cut: return None
+ return None
+
+ @memoize
+ def more_alts(self) -> Optional[Rhs]:
+ # more_alts: "|" alts NEWLINE more_alts | "|" alts NEWLINE
+ mark = self.mark()
+ cut = False
+ 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 cut: return None
+ cut = False
+ if (
+ (literal := self.expect("|"))
+ and
+ (alts := self.alts())
+ and
+ (newline := self.expect('NEWLINE'))
+ ):
+ return Rhs ( alts . alts )
+ self.reset(mark)
+ if cut: return None
+ return None
+
+ @memoize
+ def alt(self) -> Optional[Alt]:
+ # alt: items '$' action | items '$' | items action | items
+ mark = self.mark()
+ cut = False
+ 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 cut: return None
+ cut = False
+ if (
+ (items := self.items())
+ and
+ (literal := self.expect('$'))
+ ):
+ return Alt ( items + [ NamedItem ( None , NameLeaf ( 'ENDMARKER' ) ) ] , action = None )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (items := self.items())
+ and
+ (action := self.action())
+ ):
+ return Alt ( items , action = action )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (items := self.items())
+ ):
+ return Alt ( items , action = None )
+ self.reset(mark)
+ if cut: return None
+ return None
+
+ @memoize
+ def items(self) -> Optional[NamedItemList]:
+ # items: named_item items | named_item
+ mark = self.mark()
+ cut = False
+ if (
+ (named_item := self.named_item())
+ and
+ (items := self.items())
+ ):
+ return [ named_item ] + items
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (named_item := self.named_item())
+ ):
+ return [ named_item ]
+ self.reset(mark)
+ if cut: return None
+ return None
+
+ @memoize
+ def named_item(self) -> Optional[NamedItem]:
+ # named_item: NAME '=' ~ item | item | lookahead
+ mark = self.mark()
+ 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
+ cut = False
+ if (
+ (item := self.item())
+ ):
+ return NamedItem ( None , item )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (it := self.lookahead())
+ ):
+ return NamedItem ( None , it )
+ 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
+ cut = False
+ if (
+ (literal := self.expect('~'))
+ ):
+ return Cut ( )
+ self.reset(mark)
+ if cut: return None
+ 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
+ cut = False
+ if (
+ (atom := self.atom())
+ and
+ (literal := self.expect('?'))
+ ):
+ return Opt ( atom )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (atom := self.atom())
+ and
+ (literal := self.expect('*'))
+ ):
+ return Repeat0 ( atom )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (atom := self.atom())
+ and
+ (literal := self.expect('+'))
+ ):
+ return Repeat1 ( atom )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ 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 cut: return None
+ cut = False
+ if (
+ (atom := self.atom())
+ ):
+ return atom
+ self.reset(mark)
+ if cut: return None
+ 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
+ cut = False
+ if (
+ (name := self.name())
+ ):
+ return NameLeaf ( name . string )
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (string := self.string())
+ ):
+ return StringLeaf ( string . string )
+ self.reset(mark)
+ if cut: return None
+ 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 target_atoms(self) -> Optional[str]:
+ # target_atoms: target_atom target_atoms | target_atom
+ mark = self.mark()
+ cut = False
+ if (
+ (target_atom := self.target_atom())
+ and
+ (target_atoms := self.target_atoms())
+ ):
+ return target_atom + " " + target_atoms
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (target_atom := self.target_atom())
+ ):
+ return target_atom
+ self.reset(mark)
+ if cut: return None
+ return None
+
+ @memoize
+ def target_atom(self) -> Optional[str]:
+ # target_atom: "{" ~ target_atoms "}" | NAME | NUMBER | STRING | "?" | ":" | !"}" OP
+ 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
+ cut = False
+ if (
+ (name := self.name())
+ ):
+ return name . string
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (number := self.number())
+ ):
+ return number . string
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (string := self.string())
+ ):
+ return string . string
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (literal := self.expect("?"))
+ ):
+ return "?"
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ (literal := self.expect(":"))
+ ):
+ return ":"
+ self.reset(mark)
+ if cut: return None
+ cut = False
+ if (
+ self.negative_lookahead(self.expect, "}")
+ and
+ (op := self.op())
+ ):
+ return op . string
+ self.reset(mark)
+ if cut: return None
+ return None
+
+
+if __name__ == '__main__':
+ from pegen.parser import simple_parser_main
+ simple_parser_main(GeneratedParser)