2013-04-03 14 views
11

Ho un file sorgente Haskell, che utilizzando la sintassi Unicode:Analisi UnicodeSyntax con haskell-src-exts

{-# LANGUAGE UnicodeSyntax #-} 
succ' :: Int → Int 
succ' = succ 

main :: IO() 
main = print $ succ' 1 

Questo analizza e funziona bene con GHC. Inoltre, stylish-haskell e hlint (entrambi basati su haskell-src-exts) possono leggere questo file senza problemi. Tuttavia, quando provo ad analizzare me stesso usando Haskell-src-exts:

import Language.Haskell.Exts (parseModule) 

main = do 
    x <- readFile "test.hs" 
    print $ parseModule x 

ricevo il seguente messaggio di errore:

ParseFailed (SrcLoc {srcFilename = "<unknown>.hs", srcLine = 6, srcColumn = 1}) "TypeOperators is not enabled" 

Tuttavia, fornendo UnicodeSyntax esplicitamente nella lista estensioni o utilizzando ParseFile funziona fine:

import Language.Haskell.Exts 

main = do 
    x <- readFile "test.hs" 
    print $ parseModuleWithMode defaultParseMode 
     { extensions = [UnicodeSyntax] 
     } x 

    parseFile "test.hs" >>= print 

Qualche idea sul perché il primo approccio fallisce?

+2

Da uno sguardo superficiale all'origine, non sembra che 'parseModule' estrae il prgema del linguaggio dall'origine _before_parsing (' parseFile' lo fa chiamando 'getExtensions'). Quando è iniziata l'analisi, è già troppo tardi per abilitare la sintassi Unicode. –

+0

Hai ragione, grazie! Sembra che parseFileContents sia la funzione appropriata per il mio caso d'uso. Se converti il ​​tuo commento in una risposta, la contrassegnerò come la risposta corretta. –

+0

Fatto! Non ero assolutamente sicuro che questa fosse la ragione, ma a ben guardare, sembra proprio che sia così. –

risposta

6

Da una rapida occhiata alla fonte, non sembra parseModule pragma estratti dalla lingua di origine prima di parsing (parseFile non farlo chiamando getExtensions). Quando è iniziata l'analisi, è già troppo tardi per abilitare la sintassi Unicode.