我想为一种允许文件包含的简单语言实现Parsec解析器。即,语言如下:
include otherfile;
expression in the language;
如果解析了包含,我想读取具有此名称的文件并将其解析的内容嵌入父结构中。
由于我必须读取文件,因此解析器需要在IO中打包。我的猜测是u
中的underyling monad ParsecT s u m a
可以用于此。但是,这导致语言定义发生了相当大的变化,因为LanguageDef依赖Identity
作为底层monad。
我的方法合理吗?是否有其他方法可以在解析器中包含文件,例如,扩展输入流?
答案 0 :(得分:0)
好的,这就是我想出的:
parsecTrans :: Monad m => ParsecT s u Identity a -> ParsecT s u m a
parsecTrans p = mkPT $ \s -> return $ fmap (return . runIdentity) $ runIdentity $ (runParsecT p) s
此函数解包ParsecT
monad并将其推广到任意monad。您可以使用它将所有基于Identity
的解析器提升为基于IO
的解析器。