背景:
我使用Alex和Parsec的组合来解析缩进敏感语言。一条更加缩进的线然后是它上面的那条线,我或者是该线的数据,或者是该线上的命令的延续。 Alex无法确切知道,因此它只返回一个Block{...}
令牌。
解析器知道何时需要数据块并将数据传递给解释器使用的抽象语法树。
当解析器在需要其他内容时遇到Block
令牌时,会出现问题。我有一个函数可以将块令牌转换为Tokens
的{{1}}列表,但我似乎无法将它应用到输入流中的正确位置。
问题:
鉴于解析器组合器在输入流中的某个标记处失败,是否有办法修改导致失败的令牌并继续评估新输入流或至少再次尝试?
我想编写一个函数lex_block
,如下所示:
retry
> retry :: (s -> Maybe s) -> ParsecT s u m a -> ParsecT s u m a
的作用类似于解析器retry f p
,但如果p
失败,则使用函数p
来更改f
点失败的输入流,重试p
。当p
返回f
时,会传递失败。
我曾尝试使用Nothing
,getInput
和setInput
来编写此内容,但我无法弄清楚如何在解析器组合器失败时获取输入流而不是点它开始了。我想如果我能找到一种方法来告诉输入流中发生故障的位置,我可以做到这一点。