-1

我正在使用haskell-src-exts包来解析import模块内的声明,这是我正在使用的代码

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-exts忽略这些并继续吗?

谢谢。

4

1 回答 1

2

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

于 2016-07-13T18:53:07.747 回答