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 "

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.

token Script
    = ScriptEscape+
    ;
token ScriptEscape
    = !"<"
    ;

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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top