2016-07-13 7 views
-1

I haskell-src-exts Paket bin mit den import Erklärungen innerhalb eines Moduls zu analysieren, hier ist der Code, den ichRichtlinien ignorieren, wenn Haskell Module Parsen

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 

Diese Failes sobald der Parser trifft auf eine #ifdef Richtlinie verwenden.

Soll das passieren, kann haskell-src-exts diese ignorieren und weitermachen?

Danke.

+3

Sie könnten den Präprozessor in Ihr Programm pipen. – Gurkenglas

+0

Welche Art von Ergebnis erwarten Sie vom Parser? Der Parser gibt einen AST zurück, während der Präprozessor auf der Token-Ebene arbeitet. Es gibt keinen vernünftigen Weg, einen AST zu definieren, ohne den CPP auszuführen, so dass z.B. nur ein Zweig in einem # ifdef/# else/# endif wird ausgewählt. – chi

+0

Ich sehe danke! Ich fügte einen einzelnen Durchlauf von cpphs hinzu und es scheint, das Problem zu beheben! – aesadde

Antwort

2

Das wollen Sie wirklich nicht. Ein Haskell-Modul, das mit CPP geschrieben wurde, wird im Allgemeinen nicht analysiert, geschweige denn sinnvoll, wenn Sie den CPP ignorieren. Als Gurkenglas suggests besteht die Lösung darin, den Präprozessor auszuführen, bevor Sie versuchen, die Datei zu analysieren.