Escribir un analizador con M, consumen mientras no se descarta
Pregunta
Estoy escribiendo un analizador HTML para mi propia diversión y quería probar M.
baso este trabajo en el estándar HTML 4.01 y allí se dice
Aunque el estilo y los elementos SCRIPT CDATA utilizar para su modelo de datos, por estos elementos, CDATA deben ser manejados de manera diferente por los agentes de usuario. marcado y las entidades deben ser tratados como texto sin formato y pasa a la aplicación como es. La primera aparición del carácter secuencia "" (etiqueta de fin delimitador abierto) se trata como terminación final de el contenido del elemento. en válida documentos, esta sería la etiqueta de cierre para el elemento.
pienso en ello durante un tiempo y realmente lo que quiero hacer es algo como esto
syntax Main
= "<script>" Script "</script>"
;
token Script
= TakeWhileNot("</") // this is not valid M grammar
;
Me encuentro mi auto descubrimiento que quiero llevar a cabo algún tipo de regla que tokenización partidos hasta llegar a un soporte de ángulo abierto Si la secuencia de escape era un solo carácter esto no sería un problema porque entonces yo podría haber escrito esto. Y que quiere trabajar, no estoy seguro si voy de este por el camino correcto, pero el problema es una especie de relación con que tengo un lenguaje incrustado en otro pero no se preocupan por el lenguaje de script en este caso, por lo simplemente quiero saltar una cabeza. token Script
= ScriptEscape+
;
token ScriptEscape
= !"<"
;
Solución
me di cuenta de este truco, que no era del todo evidente ...
syntax Main
= "<script>" Script* "</script>"
;
token Script
= !('<')
| '<' !('/')
;
Ahora que MGrammar válida, lo que se traduce en:
- No tome '<' o tomar '<' No seguida de '/'
Lo que consumiría nada hasta que un