Escrever um analisador com m, consuma enquanto não governa
Pergunta
Estou escrevendo um analisador html para minha própria diversão e queria experimentar M.
Eu baseio este trabalho no padrão HTML 4.01 e lá diz
Embora os elementos de estilo e script usem CDATA para seu modelo de dados, para esses elementos, o CDATA deve ser tratado de maneira diferente pelos agentes do usuário. Markup e entidades devem ser tratadas como texto bruto e transmitidas para o aplicativo como está. A primeira ocorrência da sequência do personagem "
Eu penso nisso por um tempo e realmente o que eu quero fazer é algo assim
syntax Main
= "<script>" Script "</script>"
;
token Script
= TakeWhileNot("</") // this is not valid M grammar
;
Acho que eu acho que quero executar algum tipo de regra de tokenização que corresponda até que eu alcance um suporte de ângulo aberto <seguido de uma barra para a frente /.
Se a sequência de fuga fosse um único personagem, isso não seria um problema, porque eu poderia ter escrito isso.
token Script
= ScriptEscape+
;
token ScriptEscape
= !"<"
;
E isso funcionaria, não tenho certeza se estou fazendo isso da maneira certa, mas o problema está meio relacionado a isso, eu tenho um idioma incorporado em outro, mas não me importo com a linguagem do script neste caso, então eu simplesmente quero para pular a cabeça.
Solução
Eu descobri esse truque interessante, que não era totalmente óbvio ...
syntax Main
= "<script>" Script* "</script>"
;
token Script
= !('<')
| '<' !('/')
;
Agora isso é mGrammar válido, que se traduz em:
- Não tome '<' ou leve '<' não seguido por '/'
O que consumiria qualquer coisa até um