代码之家  ›  专栏  ›  技术社区  ›  Alex Ling Zhong

在Attoparsec中解析时实现“includes”

  •  3
  • Alex Ling Zhong  · 技术社区  · 7 年前

    我想使用如下相对文件名实现对包含的解析:

    include /some/dir/file.ext
    

    或网址:

    include http://blah.com/my/file.ext
    

    问题是,尽管这些语句的解析很容易,但我无法在我的Attoparsec解析器中运行IO(据我所知)。

    如何使用ATOPASSERC实现这一点?我是否使用一些字符串过滤将初始输入切碎,然后将每个“块”解析为 parse feed

    1 回复  |  直到 7 年前
        1
  •  5
  •   Jon Purdy    7 年前

    阿托帕塞克是纯的( 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 变压器,你可以环绕 木卫一 木卫一

    推荐文章