获取当前上下文错误格式化函数

Getting current context error formatting function

我正在使用 Megaparsec 来获取代码的树表示,稍后由单独的函数对其进行评估。我想将具有当前上下文的 parsec 函数添加到树表示的节点以格式化错误。

为什么?例如。语法可能没问题,但代码中的某些变量可能不存在,只有稍后处理树的分离函数才能发现。这些函数将不得不抛出错误,该变量不存在,如果我可以为此使用格式正确的 Megaparsec 错误(带有行号、上下文等),我会很高兴。

请问有什么办法吗?

谢谢。

我相信你可以通过getSourcePos得到当前位置。例如,在树生成的 open-recursion 样式中,您可以编写

data Annotated f = Annotated
    { start :: SourcePos
    , term :: f (Annotated f)
    , end :: SourcePos
    }

annotated :: (MonadParser e s m, TraversableStream s) =>
    m (f (Annotated f)) -> m (Annotated f)
annotated p = liftA3 Annotated getSourcePos p getSourcePos

(N.B。我还没试过,甚至 type-checked 也没试过;我只是尽我最大的努力用专家的眼光来解释 megaparsec 的文档。注意讲者。)