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. XMLの要素間の空白(終了タグと開始タグ)?
- 5. TextMateは、一致する開始タグと終了タグを見つけることができますか?
- 6. オープンとタグRSSでタグの不一致&データの早期の終了を終了
- 7. 開始タグと終了タグの間の線
- 8. 変更AngularJSの開始タグと終了タグ
- 9. RegExを使用して終了タグとHTMLの開始タグを正しく一致させる
- 10. ZPLネストされた開始タグと終了タグ
- 11. minidomを使用してXML内の単一の開始タグまたは終了タグを削除する方法
- 12. GEdit - ハイライト開始タグ - 選択したHTMLの終了タグ?
- 13. 開始タグと終了タグの間のテキストの用語ですか?
- 14. xml開始タグを入力するときに自動的に終了タグを追加しますか?
- 15. JOOX自己終了XMLタグ
- 16. 終了タグか
- 17. XAML/XML/HTMLの開始タグ名と終了タグ名を一度に置き換えるVisual Studioのショートカットはありますか?
- 18. JSTL foreachループで、柔軟性のために変数を持つ開始タグと終了タグを指定する
- 19. 正規表現を使用して複数の開始タグと終了タグの間でコンテンツを見つける
- 20. AutoHotkey:単語を開始タグと終了タグに変換する方法。 "div"は "<div></div>"
- 21. JavaScriptで特定のタグで開始および終了するテキストエリア内のハイライトテキスト
- 22. gulp-inject:pugを使用したときの開始タグの終了タグがありません
- 23. 印刷終了タグ
- 24. このサンプルXMLノードを考えると終了タグ
- 25. XMLクリーンアップ - 一致しないタグ
- 26. XML/XSL:終了タグが必要ですが、終了タグはそこにあります。エラーを続ける
- 27. Word 2013でPDFファイルを開くときに終了タグの不一致エラーが発生する
- 28. TypeError:Error#1085:エレメントタイプ "opi1"は、一致する終了タグ "</opi1>"で終了する必要があります
- 29. 開始タグと終了XMLタグの間に発生するコンテンツで、アポストラフィックがエンコードされていないように見えるのですか?
- 30. 要素のouterHTMLの開始タグだけを一致/捕捉する方法
$ openTagは、TAG_OPENによって作成された*ツリー*へのアクセスを提供しますか? –
はい、正確です(https://github.com/antlr/antlr4/blob/master/doc/actions.md)。 'openTag'と' closeTag'ラベルを省略して '$ TAG_OPEN'と' $ TAG_CLOSE'を直接使うこともできます。関数tagsMatch()は、目標言語を使用してトークン値(例えば、テキスト)にアクセスすることができる。 –
はい、これはうまくいくように聞こえます。あなたは木があるときにスタックを必要とする: - ? –