2009-11-25 3 views
0

J'exclus écris un parseur HTML pour mon propre amusement et je voulais essayer M.L'écriture d'un analyseur avec M, consommer sans

Je base ce travail sur le HTML 4.01 standard et là il est dit

Bien que les éléments STYLE et SCRIPT utilisation CDATA pour leur modèle de données, pour ces éléments, CDATA doivent être traités différemment par les agents utilisateurs. Les entités de balisage et doivent être traitées comme du texte brut et transmises à l'application en l'état. La première occurrence du caractère séquence "< /" (délimiteur ouvert de fin de balise) est considérée comme terminant la fin du contenu de l'élément . Dans les documents valides, ce serait l'étiquette de fin pour l'élément.

Je pense pendant un certain temps et vraiment ce que je veux faire est quelque chose comme ça

syntax Main 
    = "<script>" Script "</script>" 
    ; 
token Script 
    = TakeWhileNot("</") // this is not valid M grammar 
    ; 

Je trouve mon moi conclusion que je veux effectuer une sorte de règle de tokens qui correspond jusqu'à atteindre une équerre ouverte < suivie d'une barre oblique /.

Si la séquence d'échappement était un seul caractère, cela ne poserait pas de problème car j'aurais pu écrire cela.

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

Et cela pourrait fonctionner, pas sûr si je vais sur ce la bonne façon, mais le problème est lié en quelque sorte que j'ai un langage intégré dans un autre mais je ne se soucient pas du langage de script dans ce cas, je veux simplement sauter une tête.

Répondre

0

Je compris cette astuce, qui était pas tout à fait évident ...

syntax Main 
    = "<script>" Script* "</script>" 
    ; 
token Script 
    = !('<') 
    | '<' !('/') 
    ; 

Maintenant que est MGrammar valide, ce qui se traduit par:

  • Ne prenez pas « < » OU prendre « < » Non suivi de «/»

qui consommerait quoi que ce soit jusqu'à ce qu'un </jeton est encountere sans le consommer.