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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top