2

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

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

请问有什么办法吗?

谢谢。

4

1 回答 1

1

我相信您可以通过getSourcePos. 例如,在树生成的开放递归风格中,您可以编写

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

(注意,我没有尝试过,甚至没有对它进行类型检查;只是尽我所能用专家的眼光解释 megaparsec 的文档。警告讲师。)

于 2022-02-15T20:01:19.127 回答