2011-10-13 16 views
11

La miscelazione del lexer e delle fasi di parsing in una fase a volte rende i parser Parsec meno leggibili ma li rallenta. Una soluzione è usare Alex come tokenizer e poi Parsec come parser del token stream.Esiste un haskell EDSL per scrivere i lexer?

Questo va bene, ma sarebbe ancora meglio se potessi sbarazzarmi di Alex perché aggiunge una fase di pre-elaborazione nella pipeline di compilazione, non si integra bene con gli "IDE" haskell, ecc. Mi chiedevo se ci fosse una cosa come haskell EDSL per descrivere i tokenizer, molto nello stile di Alex, ma come una libreria.

+0

Questa è una domanda che ho cercato in come di ritardo, ma ci sono stati niente che abbia veramente visto. Sto immaginando forse un EDS RegEx da cui creiamo un tokenizer senza tag (:: [RegEx] -> String -> [String]). –

+0

Potrei trovare una soluzione rapida usando qualsiasi libreria di espressioni regolari cercando di far corrispondere la stringa corrente ad ogni regexp, ma perderei molte ottimizzazioni di Alex a causa della sua conoscenza dell'insieme di tutte le espressioni regolari. –

risposta

4

Sì - http://www.cse.unsw.edu.au/~chak/papers/Cha99.html

Prima Hackage, Manuel utilizzato per rilasciare il codice in un pacchetto chiamato CTK (compilatore toolkit). Non sono sicuro di quale sia lo stato del progetto in questi giorni.

Penso che il lexer di Thomas Hallgren dal documento "Lexing Haskell in Haskell" fosse dinamico piuttosto che un generatore di codice, mentre la versione è stata pensata per lexing Haskell, il macchinario nella biblioteca è più generale. Assapora che Diatchki ha messo il codice su Hackage.

http://hackage.haskell.org/package/haskell-lexer

+0

Perfetto, grazie! –

3

È possibile utilizzare anche Parsec come il lexer. Per prima cosa si analizza la stringa in token, quindi si analizzano i token nel tipo di dati di destinazione.

+0

Vero, ma poi perdi la velocità dei DFA minimi che potresti ottenere con uno strumento come Alex senza perdere espressività (preferisco Parsec su, ad esempio, Yacc perché offre una migliore modularità/espressività, ma non sono convinto che questo sia molto utile per i lexer). Ma almeno, risolve il problema della miscelazione delle due fasi. Grazie. –

Problemi correlati