Schreiben Sie einen Parser mit M, consume, während nicht ausschließen
Frage
Ich bin ein HTML-Parser für meine eigene Unterhaltung zu schreiben, und ich wollte M ausprobieren.
Ich stütze diese Arbeit auf dem HTML 4.01-Standard und dort heißt es
Obwohl der STYLE und SCRIPT-Elemente verwenden CDATA für ihr Datenmodell für diese Elemente, CDATA muss behandelt werden unterschiedlich von Benutzerprogrammen. Markup und Einheiten müssen als Rohtext behandelt werden und auf die Anwendung als übergeben. Das erste Auftreten des Zeichens Sequenz "" (End-Tag Anfangsbegrenzer) wird als die Einstellung des Endes der behandelten den Inhalt des Elements. in gültig Dokumente, würde dies das Ende-Tag sein für das Element.
Ich denke über den es für eine Weile und wirklich das, was ich will, ist so etwas wie dies
syntax Main
= "<script>" Script "</script>"
;
token Script
= TakeWhileNot("</") // this is not valid M grammar
;
ich meine Selbstfindung feststellen, dass ich eine Art tokenization Regel ausgeführt werden soll, dass Streichhölzer, bis ich erreichen einen offenen Winkel Wenn die Escape-Sequenz ein einzelne Zeichen ist, würde dies kein Problem sein, denn dann könnte ich diesen geschrieben habe. Und das funktionieren würde, nicht sicher, ob ich darüber den richtigen Weg gehe, aber das Problem ist eine Art zu dem im Zusammenhang, dass ich eine Sprache in einer anderen eingebettet, aber ich kümmere mich nicht um die Skriptsprache in diesem Fall so ich möchte einfach einen Kopf überspringen. token Script
= ScriptEscape+
;
token ScriptEscape
= !"<"
;
Lösung
dachte ich diesen netten Trick aus, die nicht ganz klar war, ...
syntax Main
= "<script>" Script* "</script>"
;
token Script
= !('<')
| '<' !('/')
;
Nun, da der gültige MGrammar, die in übersetzt:
- Nehmen Sie nicht die '<' OR nehmen '<' NICHT '/'
Welche etwas, bis ein