解析haskell模块时忽略指令

解析haskell模块时忽略指令,haskell,ghc,haskell-src-exts,Haskell,Ghc,Haskell Src Exts,我使用haskell src exts包解析模块内的导入声明,下面是我使用的代码 importNames :: FilePath -> IO () importNames fname = do let pMode = parseMode fname parsed <- P.parseFileWithMode pMode fname case parsed of P.ParseOk m -> do let names = modNames m putStr

我使用haskell src exts包解析模块内的导入声明,下面是我使用的代码

importNames :: FilePath -> IO ()
importNames fname =  do
let pMode = parseMode fname
parsed <- P.parseFileWithMode pMode fname
case parsed of
  P.ParseOk m -> do
    let names  = modNames m
    putStrLn $ P.prettyPrint
  P.ParseFailed srcLoc message -> do
    putStrLn $ unlines [P.prettyPrint srcLoc , message]

-- | Extract all imports from a Module
extractImports :: Module -> [ImportDecl]
extractImports (Module _ _ _ _ _ imports _) = imports

modNames :: Module -> S.Set ModuleName
modNames m = foldr (\i r -> S.insert (importModule i) r) 
             S.empty $ extractImports m
一旦解析器点击ifdef指令,该操作就会失败

这应该会发生吗?haskell src EXT可以忽略这些并继续吗


谢谢。

你真的不想那样做。如果忽略CPP,使用CPP编写的Haskell模块通常不会解析,更不用说有任何意义了。同样,解决方案是在尝试解析文件之前运行预处理器。

您可以将预处理器导入程序。您希望解析器产生什么样的结果?解析器返回AST,而预处理器在令牌级别工作。在不运行CPP的情况下,没有合理的方法来定义AST,例如,只选择ifdef/else/endif中的一个分支。我明白了,谢谢!我添加了一次CPPH,似乎解决了这个问题!