76 lines
2.2 KiB
Text
76 lines
2.2 KiB
Text
/-
|
|
Copyright (c) 2018 Microsoft Corporation. All rights reserved.
|
|
Released under Apache 2.0 license as described in the file LICENSE.
|
|
Author: Sebastian Ullrich
|
|
|
|
Level-level parsers
|
|
-/
|
|
prelude
|
|
import init.lean.parser.pratt
|
|
|
|
namespace lean
|
|
namespace parser
|
|
open combinators parser.hasView monadParsec
|
|
|
|
@[derive monad alternative monadReader monadParsec monadExcept monadRec monadBasicParser]
|
|
def levelParserM := recT nat syntax basicParserM
|
|
abbrev levelParser := levelParserM syntax
|
|
|
|
/-- A level parser for a suffix or infix notation that accepts a preceding term level. -/
|
|
@[derive monad alternative monadReader monadParsec monadExcept monadRec monadBasicParser]
|
|
def trailingLevelParserM := readerT syntax levelParserM
|
|
abbrev trailingLevelParser := trailingLevelParserM syntax
|
|
|
|
instance trailingLevelParserCoe : hasCoe levelParser trailingLevelParser :=
|
|
⟨λ x _, x⟩
|
|
|
|
@[derive parser.hasTokens parser.hasView]
|
|
def level.parser (rbp := 0) : levelParser :=
|
|
recurse rbp <?> "universe level"
|
|
|
|
namespace level
|
|
/-- Access leading term -/
|
|
def getLeading : trailingLevelParser := read
|
|
instance : hasTokens getLeading := default _
|
|
instance : hasView syntax getLeading := default _
|
|
|
|
@[derive parser.hasTokens parser.hasView]
|
|
def paren.parser : levelParser :=
|
|
node! «paren» ["(":maxPrec, inner: level.parser 0, ")"]
|
|
|
|
@[derive parser.hasTokens parser.hasView]
|
|
def leading.parser : levelParser :=
|
|
nodeChoice! leading {
|
|
max: symbolOrIdent "max",
|
|
imax: symbolOrIdent "imax",
|
|
hole: symbol "_" maxPrec,
|
|
paren: paren.parser,
|
|
lit: number.parser,
|
|
var: ident.parser
|
|
}
|
|
|
|
@[derive parser.hasTokens parser.hasView]
|
|
def app.parser : trailingLevelParser :=
|
|
node! app [fn: getLeading, arg: level.parser maxPrec]
|
|
|
|
@[derive parser.hasTokens parser.hasView]
|
|
def addLit.parser : trailingLevelParser :=
|
|
node! addLit [lhs: getLeading, "+", rhs: number.parser]
|
|
|
|
@[derive parser.hasTokens parser.hasView]
|
|
def trailing.parser : trailingLevelParser :=
|
|
nodeChoice! trailing {
|
|
app: app.parser,
|
|
addLit: addLit.parser
|
|
}
|
|
end level
|
|
|
|
@[derive parser.hasTokens parser.hasView]
|
|
def levelParser.run (p : levelParser) : basicParser :=
|
|
prattParser level.leading.parser level.trailing.parser p
|
|
|
|
instance levelParserCoe : hasCoe levelParser basicParser :=
|
|
⟨levelParser.run⟩
|
|
|
|
end parser
|
|
end lean
|