@@ -169,7 +169,6 @@ deriving ToJson, FromJson, BEq, Repr, Quote
169169
170170
171171-- Based on mkErrorMessage used in Lean upstream - keep them in synch for best UX
172- open Lean.Parser in
173172private partial def mkSyntaxError (c : InputContext) (pos : String.Pos.Raw) (stk : SyntaxStack) (e : Parser.Error) : SyntaxError := Id.run do
174173 let mut pos := pos
175174 let mut endPos? := none
@@ -219,49 +218,44 @@ public defmethod ParserFn.parseString [Monad m] [MonadError m] [MonadEnv m] (p :
219218 else
220219 pure stk[0 ]
221220
221+ -- Default from upstream
222+ public def runParserCategory.toErrorMsg (ictx : InputContext) (s : ParserState) :=
223+ s.toErrorMsg ictx
222224
223- open Lean.Parser in
224- /--
225- Runs a parser category, returning any errors encountered as a list of position-string pairs.
225+ -- Unused
226+ public def runParserCategory.toErrorMsgList (ictx : InputContext) (s : ParserState) : List (Position × String) := Id.run do
227+ let mut errs := []
228+ for (pos, _stk, err) in s.allErrors do
229+ let pos := ictx.fileMap.toPosition pos
230+ errs := (pos, toString err) :: errs
231+ errs.reverse
232+
233+ -- Used in Manual's syntaxError block
234+ public def runParserCategory.toSyntaxErrors (ictx : InputContext) (s : ParserState) : Array SyntaxError :=
235+ s.allErrors.map fun (pos, stk, e) => (mkSyntaxError ictx pos stk e)
236+
237+ /-- Runs a parser category, returning any errors encountered. It takes
238+ and optional `fileName` as callers in VersoManual/Docstring like to
239+ override it.
226240-/
227- public def runParserCategory
228- (env : Environment) (opts : Lean.Options) (catName : Name)
229- (input : String) (fileName : String := "<example>" ) :
230- Except (List (Position × String)) Syntax :=
241+ public def runParserCategoryGen [Monad m] [MonadEnv m] [MonadLog m] [MonadOptions m]
242+ (errorFn : InputContext → ParserState → ε)
243+ (catName : Name) (input : String) (fileName : Option String := none) : m (Except ε Syntax) := do
244+ let fileName ← fileName.getDM getFileName
245+ let env ← getEnv
246+ let options ← getOptions
231247 let p := andthenFn whitespace (categoryParserFnImpl catName)
232248 let ictx := mkInputContext input fileName
233- let s := p.run ictx { env, options := opts } (getTokenTable env) (mkParserState input)
234- if !s.allErrors.isEmpty then
235- Except.error (toErrorMsg ictx s)
249+ let s := p.run ictx { env, options } (getTokenTable env) (mkParserState input)
250+ pure $ if !s.allErrors.isEmpty then
251+ Except.error (errorFn ictx s)
236252 else if ictx.atEnd s.pos then
237253 Except.ok s.stxStack.back
238254 else
239- Except.error (toErrorMsg ictx (s.mkError "end of input" ))
240- where
241- toErrorMsg (ctx : InputContext) (s : ParserState) : List (Position × String) := Id.run do
242- let mut errs := []
243- for (pos, _stk, err) in s.allErrors do
244- let pos := ctx.fileMap.toPosition pos
245- errs := (pos, toString err) :: errs
246- errs.reverse
247-
248- open Lean.Parser in
249- /--
250- Runs a parser category, returning any errors encountered as `SyntaxError`s, with the source spans
251- computed the way Lean does.
252- -/
253- public def runParserCategory' (env : Environment) (opts : Lean.Options) (catName : Name) (input : String) (fileName : String := "<example>" ) : Except (Array SyntaxError) Syntax :=
254- let p := andthenFn whitespace (categoryParserFnImpl catName)
255- let ictx := mkInputContext input fileName
256- let s := p.run ictx { env, options := opts } (getTokenTable env) (mkParserState input)
257- if !s.allErrors.isEmpty then
258- Except.error <| toSyntaxErrors ictx s
259- else if ictx.atEnd s.pos then
260- Except.ok s.stxStack.back
261- else
262- Except.error (toSyntaxErrors ictx (s.mkError "end of input" ))
263- where
264- toSyntaxErrors (ictx : InputContext) (s : ParserState) : Array SyntaxError :=
265- s.allErrors.map fun (pos, stk, e) => (mkSyntaxError ictx pos stk e)
255+ Except.error (errorFn ictx (s.mkError "end of input" ))
256+
257+ public def runParserCategory [Monad m] [MonadEnv m] [MonadLog m] [MonadOptions m]
258+ (catName : Name) (input : String) (fileName : Option String := none) : m (Except String Syntax) :=
259+ runParserCategoryGen runParserCategory.toErrorMsg catName input fileName
266260
267261end Verso.SyntaxUtils
0 commit comments