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?
risposta
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.
È 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".
C'è qualche esempio su come usare il token? – mb14
- 1. Esiste un modo per fare in modo che i rapporti parsec segnalino conflitti "shift-reduce"?
- 2. Un modo semplice per modificare il tipo di stato utente Parsec?
- 3. Il modo migliore per trovare un lavoro ovunque in Sidekiq
- 4. C'è un modo per evitare $ this-> ovunque?
- 5. Come meglio analizzare una grammatica semplice?
- 6. Haskell Parsec Parser per l'incontro [...]
- 7. Esiste un modo per determinare l'ambiguità in una grammatica?
- 8. Boost :: Esempio di grammatica semplice di Spirit
- 9. ANTLR Qual è il modo più semplice per realizzare la grammatica basata su indent python?
- 10. Qual è il modo più semplice per dire se una grammatica BNF è ambigua o no?
- 11. Un modo semplice per disabilitare un UITextField?
- 12. Grammatica grammatica dispari
- 13. Ignora spazi bianchi con PEG.js
- 14. Haskell Parsec woes
- 15. C'è un modo semplice per usare InternalsVisibleToAttribute?
- 16. Un modo semplice per popolare questa matrice?
- 17. phpinfo: un modo semplice per vederlo?
- 18. Un modo semplice per riordinare le colonne?
- 19. Un modo semplice per unire i plists?
- 20. Un modo semplice per invertire String
- 21. Un modo semplice per appiattire questo array?
- 22. Modo conciso per creare una lista di lunghezza 0+ nella grammatica di Marpa?
- 23. È 'auto a_class :: f (...) -> T const' ambiguo nella grammatica?
- 24. C'è un modo semplice per fare gcc omettere crtbegin.o/crtend.o?
- 25. C'è un modo semplice per impostare nullglob per un glob
- 26. Un modo semplice per selezionare rapidamente un intero gruppo di selezione nella casella di selezione
- 27. Ricerca di un modello con Parsec
- 28. Il target C++ genera errore con la grammatica semplice T.g
- 29. Un modo semplice per decomprimere un file .zip usando zlib
- 30. Un modo semplice per testare un carico pigro proprietà
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