解析 haskell 模块时忽略指令
Ignore directives when parsing haskell modules
我正在使用 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
可以忽略这些并继续吗?
谢谢。
你真的不想那样做。如果忽略 CPP,使用 CPP 编写的 Haskell 模块通常不会解析,更不用说任何意义了。由于 ,解决方案是在尝试解析文件之前 运行 预处理器。
我正在使用 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
可以忽略这些并继续吗?
谢谢。
你真的不想那样做。如果忽略 CPP,使用 CPP 编写的 Haskell 模块通常不会解析,更不用说任何意义了。由于