Scrivere un parser con M, consumare mentre non esclude
Domanda
Sto scrivendo un parser HTML per mio divertimento e volevo provare M.
Baso questo lavoro sul HTML 4.01 standard ed in là si dice
Anche se lo stile e gli elementi SCRIPT utilizzare CDATA per il loro modello di dati, per questi elementi, CDATA devono essere manipolati diversamente dai programmi utente. markup e entità devono essere trattati come testo grezzo e trasmessa all'applicazione come è. La prima occorrenza del carattere sequenza "" (fine-tag aperto delimitatore) viene trattato come chiude la fine il contenuto dell'elemento. in valida documenti, questo sarebbe il tag finale per l'elemento.
Credo che su di esso per un po 'e davvero quello che voglio fare è qualcosa di simile
syntax Main
= "<script>" Script "</script>"
;
token Script
= TakeWhileNot("</") // this is not valid M grammar
;
trovo la mia scoperta di sé che voglio per eseguire una sorta di regola di tokenizzazione che corrisponde fino a raggiungere una parentesi angolare aperta Se la sequenza di fuga era un singolo carattere questo non sarebbe un problema, perché poi ho potuto scrivere questo. E che avrebbe funzionato, non so se ho intenzione di questo il modo giusto, ma il problema è una sorta di correlate a che ho un linguaggio incorporato in un altro, ma non si preoccupano il linguaggio di script in questo caso in modo voglio semplicemente saltare una testa. token Script
= ScriptEscape+
;
token ScriptEscape
= !"<"
;
Soluzione
ho capito questo trucco accurato, che non era del tutto ovvio ...
syntax Main
= "<script>" Script* "</script>"
;
token Script
= !('<')
| '<' !('/')
;
Ora che è valida MGrammar, che si traduce in:
- Non prendere '<' o prendere '<' non seguito da '/'
Il che consumare nulla fino a quando si incontra un