feat(library/init/lean/parser): depArrow proof of concept

This commit is contained in:
Leonardo de Moura 2019-07-08 10:49:54 -07:00
parent e2bcf179ac
commit d3ca360e7f
3 changed files with 29 additions and 4 deletions

View file

@ -806,6 +806,22 @@ let asciiSym := asciiSym.trim;
{ info := unicodeSymbolInfo sym asciiSym lbp,
fn := unicodeSymbolFn sym asciiSym }
def unicodeSymbolCheckPrecFnAux (sym asciiSym : String) (lbp : Nat) (errorMsg : String) (precErrorMsg : String) : ParserFn leading :=
fun (rbp : Nat) c s =>
if rbp > lbp then s.mkError precErrorMsg
else satisfySymbolFn (fun s => s == sym || s == asciiSym) errorMsg c s
@[inline] def unicodeSymbolCheckPrecFn (sym asciiSym : String) (lbp : Nat) : ParserFn leading :=
unicodeSymbolCheckPrecFnAux sym asciiSym lbp
("expected '" ++ sym ++ "' or '" ++ asciiSym ++ "'")
("found '" ++ sym ++ "' as expected, but brackets are needed") -- improve error message
@[inline] def unicodeSymbolCheckPrec (sym asciiSym : String) (lbp : Nat) : Parser leading :=
let sym := sym.trim;
let asciiSym := asciiSym.trim;
{ info := unicodeSymbolInfo sym asciiSym lbp,
fn := unicodeSymbolCheckPrecFn sym asciiSym lbp }
def mkAtomicInfo (k : String) : ParserInfo :=
{ firstTokens := FirstTokens.tokens [ { val := k } ] }

View file

@ -45,7 +45,10 @@ pushLeading >> symbol sym lbp >> termParser lbp
@[builtinTermParser] def hole := parser! symbol "_" appPrec
@[builtinTermParser] def «sorry» := parser! symbol "sorry" appPrec
@[builtinTermParser] def cdot := parser! symbol "·" appPrec
@[inline] def parenSpecial : Parser := optional (", " >> sepBy termParser ", " <|> " : " >> termParser)
def namedArgument := parser! " := " >> termParser
def typeAscription := parser! " : " >> termParser
def tupleTail := parser! ", " >> sepBy1 termParser ", "
def parenSpecial : Parser := optional (tupleTail <|> typeAscription <|> namedArgument)
@[builtinTermParser] def paren := parser! symbol "(" appPrec >> optional (termParser >> parenSpecial) >> ")"
@[builtinTermParser] def anonymousCtor := parser! symbol "⟨" appPrec >> sepBy1 termParser ", " >> "⟩"
@[inline] def optIdent : Parser := optional (try (ident >> " : "))
@ -63,12 +66,13 @@ def typeSpec := parser! " : " >> termParser
def optType : Parser := optional typeSpec
@[builtinTermParser] def subtype := parser! "{" >> ident >> optType >> " // " >> termParser >> "}"
@[builtinTermParser] def list := parser! symbol "[" appPrec >> sepBy termParser "," true >> "]"
def binderIdent := ident <|> hole
-- def binderIdent := ident <|> hole
@[builtinTermParser] def depArrow := parser! "{" >> many1 ident >> " : " >> termParser >> "}" >> unicodeSymbolCheckPrec " → " " -> " 25 >> termParser
@[builtinTermParser] def app := tparser! pushLeading >> termParser appPrec
@[builtinTermParser] def proj := tparser! pushLeading >> symbolNoWs "." (appPrec+1) >> (fieldIdx <|> ident)
@[builtinTermParser] def arrow := tparser! unicodeInfixR "→" "->" 25
@[builtinTermParser] def arrow := tparser! unicodeInfixR " → " " -> " 25
@[builtinTermParser] def array := tparser! pushLeading >> symbolNoWs "[" (appPrec+1) >> termParser >>"]"
@[builtinTermParser] def fcomp := tparser! infixR " ∘ " 90

View file

@ -51,5 +51,10 @@ test [
"f [10, 20]",
"g a[x+2]",
"g f.a.1.2.bla x.1.a",
"x+y*z < 10/3"
"x+y*z < 10/3",
"id (α := Nat) 10",
"(x : a)",
"a -> b",
"f ((x : a) -> b)",
"f ({x : a} -> b)"
]