阿托帕塞克是纯的(
Data.Attoparsec.Internal.Types.Parser
IO
)因此,您是对的,您不能直接从解析器中展开include。
include
语句与其他内容交织在一起。其他内容只需要基本上在词汇上有效,而不是完整的解析器,就像C预处理器只关心标记和匹配的括号,而不是匹配其他括号或任何语义。然后替换include,生成一个完全扩展的文件,可以将其提供给现有的解析器。
如果包含的文件在某种意义上必须是语法独立的
,然后可以首先解析整个文件,并与
s、 然后更换它们。例如:
-- Whatever items youâre parsing.
data Item
-- A reference to an included path.
data Include = Include FilePath
parse :: Parser [Either Include Item]
-- Substitute includes; also calls âparseâ
-- recursively until no includes remain.
substituteIncludes :: [Either Include Item] -> IO [Item]
比方说,如果您只是使用attoparsec对无论如何都不能跨越文件边界的令牌进行词法分析,或者您正在进行完整的解析,但希望
另一个选择是嵌入
木卫一
ParsecT
变压器,你可以环绕
木卫一
做
木卫一