0

私は自分の娯楽のためにHTMLパーサーを書いていて、Mを試してみたかったのです。

私はこの作業をHTML4.01標準に基づいており、そこには

STYLE要素とSCRIPT要素はデータモデルにCDATAを使用しますが、これらの要素の場合、CDATAはユーザーエージェントによって異なる方法で処理される必要があります。マークアップとエンティティは生のテキストとして扱われ、そのままアプリケーションに渡される必要があります。文字シーケンス「</」(終了タグのオープン区切り文字)の最初の出現は、要素のコンテンツの終わりを終了するものとして扱われます。有効なドキュメントでは、これが要素の終了タグになります。

しばらく考えて、本当にやりたいのはこんな感じ

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

開いた山かっこ<の後にスラッシュ/が続くまで一致する、ある種のトークン化ルールを実行したいと思っています。

エスケープシーケンスが単一の文字である場合、これを書くことができたので、これは問題にはなりません。

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

そして、それはうまくいくでしょう、私がこれを正しい方法で行っているかどうかはわかりませんが、問題は私が別の言語に埋め込まれていることに関連していますが、この場合はスクリプト言語を気にしないので、単に欲しいです頭をスキップします。

4

1 に答える 1

0

私はこの巧妙なトリックを理解しましたが、それは完全には明白ではありませんでした...

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

これが有効なMGrammarであり、次のように変換されます。

  • '<'をとらないでくださいまたは'<'をとらないでください'/'が後に続きます

</トークンが検出されるまで、それを消費せずに何でも消費します。

于 2009-11-26T20:48:52.050 に答える