2016-11-21 18 views

答えて

1

私はこのような一般的なアプローチを想像(しかし、実際にそれを自分自身を試したことがない)ことができます:

tag: openTag = TAG_OPEN content closeTag = TAG_CLOSE { tagsMatch($openTag, $closeTag); }?; 

タグ部分が一致しない場合は、全体のルールを失敗し、検証述語を使用すると思います。エラー報告に問題が生じるかもしれませんが、それは解決できます。

+0

$ openTagは、TAG_OPENによって作成された*ツリー*へのアクセスを提供しますか? –

+0

はい、正確です(https://github.com/antlr/antlr4/blob/master/doc/actions.md)。 'openTag'と' closeTag'ラベルを省略して '$ TAG_OPEN'と' $ TAG_CLOSE'を直接使うこともできます。関数tagsMatch()は、目標言語を使用してトークン値(例えば、テキスト)にアクセスすることができる。 –

+0

はい、これはうまくいくように聞こえます。あなたは木があるときにスタックを必要とする: - ? –

1

任意のXMLタグでは、コンテキストフリーのパーサーはこれを行うことができません。その純粋な状態のANTLRは本質的に文脈自由です。

ほとんどのパーサー(おそらくANTLRを含む)をハックすると、タグスタックを構築できます。 <tagname...が解析されると、スタック上のタグ名をプッシュすることができます。 </tagname...が解析/レキシングされると、スタックの先頭にタグ名をマッチさせることができ、不一致が発生した場合に文句を言うことができます。

私のXMLパーサー(bioを参照)でレクサーバージョンを使用していて、かなりうまくいくようです。

+0

ありがとう@Ira Baxter、私の使用例は実際にタグを検証するだけではありません(質問を単純にすることを試みていました)ので、私は文脈に敏感なパーサーを見つけることを望んでいます。私は、あなたがその時点で文脈に敏感なパーサーを認識していなかったという[2011年のあなたのSOの投稿](http://stackoverflow.com/questions/5126779/parsing-context-sensitive-language)から、それ以来変更?クイック検索では何も上向きませんでした。 – rbinnun

+0

私が説明したようにパーサをハッキングすると、この目的のためにうまく動作する文脈依存のものに変換されます。必要に応じて、コンテキスト依存の設計されたパーサを使って作業することもできます(MetaSのエントリー(https://en.wikipedia.org/wiki/Adaptive_grammar)を参照してください)が、ハッキングよりも利点はありません。 [すべての言語フロントエンドは状況依存であることがわかります。彼らは文脈に敏感な部分のための追加の随時チェックと文脈自由な解析を使用する傾向があります)。 –

関連する問題