ANTLRを使用してXMLを解析すると、ANTLRは終了タグが開始タグと一致することを検証できますか? ANTLRの本のXMLパーサーは、これをチェックしません。一致するXML開始タグと終了タグのANTLRチェック
答えて
私はこのような一般的なアプローチを想像(しかし、実際にそれを自分自身を試したことがない)ことができます:
tag: openTag = TAG_OPEN content closeTag = TAG_CLOSE { tagsMatch($openTag, $closeTag); }?;
タグ部分が一致しない場合は、全体のルールを失敗し、検証述語を使用すると思います。エラー報告に問題が生じるかもしれませんが、それは解決できます。
任意のXMLタグでは、コンテキストフリーのパーサーはこれを行うことができません。その純粋な状態のANTLRは本質的に文脈自由です。
ほとんどのパーサー(おそらくANTLRを含む)をハックすると、タグスタックを構築できます。 <tagname...
が解析されると、スタック上のタグ名をプッシュすることができます。 </tagname...
が解析/レキシングされると、スタックの先頭にタグ名をマッチさせることができ、不一致が発生した場合に文句を言うことができます。
私のXMLパーサー(bioを参照)でレクサーバージョンを使用していて、かなりうまくいくようです。
ありがとう@Ira Baxter、私の使用例は実際にタグを検証するだけではありません(質問を単純にすることを試みていました)ので、私は文脈に敏感なパーサーを見つけることを望んでいます。私は、あなたがその時点で文脈に敏感なパーサーを認識していなかったという[2011年のあなたのSOの投稿](http://stackoverflow.com/questions/5126779/parsing-context-sensitive-language)から、それ以来変更?クイック検索では何も上向きませんでした。 – rbinnun
私が説明したようにパーサをハッキングすると、この目的のためにうまく動作する文脈依存のものに変換されます。必要に応じて、コンテキスト依存の設計されたパーサを使って作業することもできます(MetaSのエントリー(https://en.wikipedia.org/wiki/Adaptive_grammar)を参照してください)が、ハッキングよりも利点はありません。 [すべての言語フロントエンドは状況依存であることがわかります。彼らは文脈に敏感な部分のための追加の随時チェックと文脈自由な解析を使用する傾向があります)。 –
- 1. XML開始タグと終了タグ
- 2. Laravel - DOMDocument :: loadXML():開始タグと終了タグの不一致 - PhpWordエラー
- 3. 開始タグと終了タグとの改行が一致する正規表現
- 4. Androidスタジオマニフェストの開始タグと終了タグ
- 5. XMLの要素間の空白(終了タグと開始タグ)?
- 6. TextMateは、一致する開始タグと終了タグを見つけることができますか?
- 7. 開始タグと終了タグの間の線
- 8. オープンとタグRSSでタグの不一致&データの早期の終了を終了
- 9. 変更AngularJSの開始タグと終了タグ
- 10. 変更開始タグと終了タグは、別途
- 11. ZPLネストされた開始タグと終了タグ
- 12. RegExを使用して終了タグとHTMLの開始タグを正しく一致させる
- 13. minidomを使用してXML内の単一の開始タグまたは終了タグを削除する方法
- 14. GEdit - ハイライト開始タグ - 選択したHTMLの終了タグ?
- 15. 開始タグと終了タグの間のテキストの用語ですか?
- 16. 擬似xmlの抽出テキストは2つの開始タグと一致する
- 17. JOOX自己終了XMLタグ
- 18. xml開始タグを入力するときに自動的に終了タグを追加しますか?
- 19. 必須のXML終了タグ名は、XML終了タグ名とまったく同じですか?
- 20. 終了タグか
- 21. スレッド終了カウントと開始カウントが一致しません。 (Xamarin.Forms)
- 22. XAML/XML/HTMLの開始タグ名と終了タグ名を一度に置き換えるVisual Studioのショートカットはありますか?
- 23. JSTL foreachループで、柔軟性のために変数を持つ開始タグと終了タグを指定する
- 24. Jqueryの終了タグ
- 25. 正規表現を使用して複数の開始タグと終了タグの間でコンテンツを見つける
- 26. カスタムHTMLのような構造の開始タグと終了タグを見つける
- 27. AutoHotkey:単語を開始タグと終了タグに変換する方法。 "div"は "<div></div>"
- 28. 開始タグと終了タグの間にスペースや改行がないときにテキストエリアプレースホルダが表示されない
- 29. JavaScriptで特定のタグで開始および終了するテキストエリア内のハイライトテキスト
- 30. SOAPUIエラー:終了タグ
$ openTagは、TAG_OPENによって作成された*ツリー*へのアクセスを提供しますか? –
はい、正確です(https://github.com/antlr/antlr4/blob/master/doc/actions.md)。 'openTag'と' closeTag'ラベルを省略して '$ TAG_OPEN'と' $ TAG_CLOSE'を直接使うこともできます。関数tagsMatch()は、目標言語を使用してトークン値(例えば、テキスト)にアクセスすることができる。 –
はい、これはうまくいくように聞こえます。あなたは木があるときにスタックを必要とする: - ? –