lean4-htt/tests/playground/parser2.lean
2019-06-20 16:48:17 -07:00

35 lines
1.3 KiB
Text

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