35 lines
1.3 KiB
Text
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
|