import init.lean.name init.lean.syntax init.lean.parser namespace Lean namespace Parser inductive ParserDescr (k : ParserKind := leading) | ident {} : ParserDescr | numLit {} : ParserDescr | strLit {} : ParserDescr | symbol {} (sym : String) (lbp : Option Nat) : ParserDescr | unicodeSymbol {} (sym ascii : String) (lbp : Option Nat) : ParserDescr | andthen (p q : ParserDescr) : ParserDescr | orelse (p q : ParserDescr) : ParserDescr | sepBy (p q : ParserDescr) : ParserDescr | sepBy1 (p q : ParserDescr) : ParserDescr | many (p : ParserDescr) : ParserDescr | many1 (p : ParserDescr) : ParserDescr | optional (p : ParserDescr) : ParserDescr | nonTerminal (id : Name) : ParserDescr | external (fn : Name) : ParserDescr | node (kind : SyntaxNodeKind) (a : ParserDescr) : ParserDescr abbrev TrailingParserDescr := ParserDescr trailing def toParser {k : ParserKind} : ParserDescr k → ExceptT String Id (Parser k) | ParserDescr.ident := pure ident | ParserDescr.numLit := pure numLit | ParserDescr.strLit := pure strLit | (ParserDescr.andthen p q) := do p ← toParser p, q ← toParser q, pure (andthen p q) | (ParserDescr.orelse p q) := do p ← toParser p, q ← toParser q, pure (orelse p q) | (ParserDescr.symbol sym lbp) := pure (symbol sym lbp) | _ := Except.error "not implemented yet" end Parser end Lean