Welcome Abroad

ANTLR V4は強力なパーサージェネレーター。学界、実業界で言語、ツール、フレームワークを作るために幅広く使われている。

↑こういったのは別として、構成ファイルの読み取りツール、レガシーコードのコンバーターwiki markupのレンダー、JSONパーサー、といった役立つツールを作ることができる。

ANTLRは文法(grammer)と呼ばれる言語定義から、入力が文法にどのように適合したかを表現するデータ構造であるパースツリーを自動的に構築できる(その言語の)パーサーを生成する。ANTLRはまた、アプリケーション固有のコードを実行するために、そのツリーのノードを渡り歩くのに使えるtree walkerも自動的に生成する。

  1. 独自の文法を構築するため、言語サンプルとリファレンスマニュアルから文法パターンを見分ける
  2. JSONのような簡単な言語からRのような複雑な言語まで文法を構築する
  3. 自動生成されたパースツリーを使って文法をベースにした言語アプリを実装する
  4. アプリケーション固有の認識エラーのハンドリング、エラー報告のカストマイズ
  5. Javaアクションを埋め込むことによるパースの完全なコントロール

What's So Cool About ANTLR V4?

ANTLR V4は学習コストの低減、文法と言語アプリケーションの開発を容易にするいくつかの重要な機能を持っている。もっとも重要なのはあらゆる文法を受け付けること(間接左再帰を除いて)。ANTLRは文法の衝突、曖昧さの警告をすることなく、与えられた文法を実行可能で、人が読めるパースコードへ変換する。

ANTLRが生成したパーサーへ妥当な入力を与えると、パーサーは文法がどんなに複雑でも常に入力を適切に認識する(もちろん、文法記述の正確さ次第)。

ANTLRパーサーはAdaptive LL(*)あるいはALL(*)と呼ばれる新しいパーサー技術を使っている。ALL(*)はV3のLL(*)の拡張で、文法解析を(生成されたパーサーが実行する前に)実行時にダイナミックに行う。ALL(*)パサーは実際の入力列を入手できるので、常に入力列をどう認識するか、文法を通して解決できる。これに対し、静的解析は入力列のすべての可能性を考慮する必要がある。

実際、ALL(*)が持つ意味はパーサー生成ツール(ANTLR V3を含む)が基礎とするパース戦略に合わせて文法を変形させる必要がないということ。もしあなたがANTLR v3の曖昧さ警告やyaccのreduce/reduce conflictで髪をかきむしったことがあるなら、ANTLRv4はあなたのためにある。

次のすばらしい特長は、ANTLR v4はプログラミング言語の数式に似た文法構造によって劇的に文法規則を簡素化していること。式を認識する最も自然な文法は、ANTLR v3のような伝統的なトップダウンパーサージェネレータでは無効。v4ではこのようなルールによって式をマッチさせることができる:

exprのような自己参照は再帰的で、実際、左再帰は少なくともその選択肢のひとつはそれ自身を参照する。

ANTLR v4はexprのような左再帰のルールを等価な非再帰へ自動的に書き換える。唯一の制約は、左再帰が直接であること(ルールが直接それ自身を参照する)。ルールは最終的にトークンをマッチングすること無く元のルールの参照へ戻る選択肢の左側の他のルールを参照できない。→5.4 Dealing with Precedence, Left Recursion, and Associativity

これら2つの文法関連の改善は、ANTLR v4による言語アプリケーションの構築をより容易にしている。ANTLRの生成したパサーはparse treesと呼ばれるアプリケーションがコードを駆動させるためにたどることのできる、都合の良い入力表現を自動的に構築する。以前のv3ユーザーはツリー構築操作によって文法を増大させる必要があった。ツリーを自動構築するのに加え、ANTLR v4はparse tree walkerをlistener形式とvisitor patternの実装として自動的に生成する。listenerはXMLパーサーによって起動されるSAXイベントに反応するXMLドキュメントハンドラに類似している。

ANTLR v4はこれらの機能によって習得が容易だけでなく、v3からいくつか引き継いでいない。

  • 最大の変更はv4は文法中の埋め込みアクション(コード)を抑え、代わりにlistener/visitorを支持していること。新しい文法とアプリケーションコードを引き離す仕組みは、コードを分けてそれを文法中に分散させるよりアプリケーションのカプセル化がうまくいく。埋め込んだアクションが無ければ、生成されたパーサーをリコンパイルさえすることなしに異なるアプリケーションへ同じ文法を再利用できる。ANTLRは今までどおり埋め込みアクションを許しているが、v4の利点を考慮すべし。
  • ANTLRはparse treeとtree walkerを自動生成するので、v4で文法木を構築する必要がない。代わりにvisitor patternのような慣れ親しんだデザインパターンを使える。これは一度ANTLRの文法規則を習得すれば、居心地の良い慣れ親しんだJava言語で言語アプリケーションを実装できるということ。
  • ANTLR v3のLL(*)パース戦略は、v4のALL(*)より弱い。そのためv3では時々、入力を適切にパースするためバックトラッキングに依存した。バックトラッキングは生成されたパーサーが同じ入力を何回もパースするかもしれないため、文法のデバッグが難しくする。またバックトラッキングはパーサーが無効な入力に対する適切なエラーメッセージを渡すのを難しくする。

from The Definitive ANTLR4 Reference by Terence Parr