1

入力が与えられます<outer> Content <inner> Inner <single/> </inner> </outer>

<single>一致する終了ノードを持つノードとともにノードを解析する文法をどのように記述しますか?

hereから取得した現在の文法は次のとおりです。

Content =
  (Element / Text)*

Element =
  startTag:StartTag content:Content endTag:EndTag {
    if (startTag != endTag) {
      throw new Error(
        "Expected </" + startTag + "> but </" + endTag + "> found."
      );
    }

    return {
      name:    startTag,
      content: content
    };
  }

StartTag =
  "<" name:TagName ">" { return name; }

EndTag =
  "</" name:TagName ">" { return name; }

TagName = chars:[a-z]+ { return chars.join(""); }
Text    = chars:[^<]+  { return chars.join(""); }

これは、終了ノードを持つノードでのみ機能します。

問題は Text ルールにあると思います。だから私はそれを変更して、次のような否定的な先読みを含めることを実験してきました:

Text    = chars:(!EndTag .)* EndTag { return chars.join(""); }

しかし、それはまだ成功したものをもたらしていません。

何か案は?

4

1 に答える 1