2015-07-29 8 views
9

Come gestite spazi bianchi e commenti? I frammenti che vengono solitamente rimossi durante la fase di analisi sintattica? Voglio attivare i commenti ovunque nel mio documento che sto analizzando. È l'aggiunta di questi in ogni parser elementare che definisco l'unica opzione?parsec: c'è un modo semplice per consentire commenti/spazi bianchi ovunque nella grammatica?

+8

Il metodo più comune (indipendente dalla libreria) per eseguire questa operazione è semplicemente disporre di un passaggio di tokenizzazione prima dell'effettivo parsing e disporre di tale eliminazione di tutti gli spazi e commenti. – Cubic

risposta

8

Il modo in cui viene eseguito in Text.Parsec.Token consiste nell'avere che ogni token consumi lo spazio e i commenti che lo seguono.

Questo viene fatto attraverso l'aiuto della lexeme Combinator:

lexeme p = do { x <- p; whitespace; return x } 

che gestisce un parser p, consuma lo spazio bianco seguendolo e ritorna qualunque p restituiti.

Quando si guarda la fonte di makeTokenParser(link) vedrete che molti dei parser gettone vengono avvolti con il lexeme Combinator, ad esempio:

symbol name 
    = lexeme (string name) 

con questo approccio, i commenti per lexeme(link) punto fuori che l'unica volta in cui il parser deve consumare esplicitamente uno spazio bianco è all'inizio dell'input per saltare qualsiasi spazio bianco prima del primo token.

7

È necessario utilizzare le capacità di parsec per definire un "parser di token". L'idea è quella di definire le caratteristiche della tua lingua in un LanguageDef e quindi utilizzare i parser derivati ​​nel risultato TokenParser, ad es. identifier, integer ecc. Puoi utilizzare la funzione lexeme dal tuo TokenParser per trasformare qualsiasi parser che potresti avere in uno che inghiotte tutti gli spazi bianchi finali.

Vedere makeTokenParser per ulteriori dettagli.

Un esempio è this code che ho scritto. È un codice del mondo reale, quindi forse non è tanto istruttivo quanto un buon tutorial, ma puoi vedere come definisco lang = makeTokenParser... e poi nei seguenti parser usare parser come whiteSpace lang, parens lang. parseTime è un esempio in cui utilizzo lexeme attorno a un parser "normale".

+0

C'è qualche esempio su come usare il token? – mb14

Problemi correlati