コンピュータベースの言語認識において、ANTLR(アントラーと発音)は、言語認識のための別のツールであり、LL(*)アルゴリズムを用いて構文解析を行うパーサー生成ツールです。ANTLRは、1989年に初めて開発されたPurdue Compiler Construction Tool Set(PCCTS)の後継であり、現在も活発に開発が進められています。そのメンテナーは、サンフランシスコ大学のテレンス・パー教授です。
ANTLR は、言語を指定する文法を入力として受け取り、その言語の認識器用のソースコードを出力として生成します。バージョン 3 では、プログラミング言語Ada95、 ActionScript、 C、 C#、 Java、 JavaScript、 Objective-C、 Perl、 Python、 Ruby、Standard MLのコード生成をサポートしていましたが、[ 3 ] バージョン 4 では現在、C#、C++、 Dart、[ 4 ] [ 5 ] Java、JavaScript、 Go、 PHP、Python (2 および 3)、Swift を対象としています。
言語は、拡張バッカス・ナウア記法(EBNF)で表現された文脈自由文法を使用して指定されます。 [ 6 ] ANTLR は、字句解析器、構文解析器、ツリー構文解析器、および字句解析器と構文解析器を組み合わせたものを生成できます。構文解析器は、構文木または抽象構文木を自動的に生成でき、これらはツリー構文解析器でさらに処理できます。ANTLR は、字句解析器、構文解析器、およびツリー構文解析器を指定するための単一の一貫した表記法を提供します。
デフォルトでは、ANTLR は文法を読み込み、その文法で定義された言語の認識器 (つまり、入力ストリームを読み込み、入力ストリームが文法で指定された構文に準拠していない場合はエラーを生成するプログラム) を生成します。構文エラーがない場合、デフォルトのアクションは、メッセージを出力せずに終了することです。言語で何らかの有用な処理を行うには、文法内の文法要素にアクションを付加することができます。これらのアクションは、認識器が生成されるプログラミング言語で記述されます。認識器が生成される際、アクションは認識器のソースコードの適切な箇所に埋め込まれます。アクションは、シンボル テーブルの構築とチェック、およびコンパイラの場合はターゲット言語での命令の出力に使用できます。[ 6 ]
ANTLRは、字句解析器や構文解析器以外にも、ツリーパーサーを生成するために使用できます。これらは、構文解析器によって自動的に生成される抽象構文木を処理する認識器です。これらのツリーパーサーはANTLR固有のものであり、抽象構文木の処理に役立ちます。[ 6 ]
ANTLR 3および ANTLR 4 は、3 条項BSD ライセンスの下で公開されているフリー ソフトウェアです。[ 7 ]以前のバージョンはパブリック ドメイン ソフトウェアとしてリリースされました。[ 8 ] Parr の著書The Definitive ANTLR 4 Referenceから派生したドキュメントは、BSD ライセンスの ANTLR 4 ソースに含まれています。[ 7 ] [ 9 ]
ANTLR文法をサポートするために、 Eclipse開発環境向けにさまざまなプラグインが開発されており、これには独自製品であるANTLR Studioのほか、SourceForgeでホストされているEclipse用プラグイン「ANTLR 2」 [ 10 ]および「ANTLR 3」[ 11 ]が含まれます。
ANTLR 4 は直接左再帰を正しく処理しますが、一般的な左再帰、つまり、xを参照するyを参照する文法規則xは処理しません。[ 12 ]
ANTLRプロジェクトのツール[ 13 ]ページで報告されているように、構文ハイライト、構文エラーチェック、コード補完などの機能を有効にするプラグインは、最も一般的なIDE(Intellij IDEA、NetBeans、Eclipse、Visual Studio [ 14 ]、Visual Studio Code)で無料で利用できます。
ANTLRを使用して構築されたソフトウェアには以下が含まれます。
ANTLR 4 に実装された 200 を超える文法がGitHubで入手可能です。[ 20 ]これらはURLの文法からC、Java、Go などの言語全体の文法まで多岐にわたります。
次の例では、ANTLRのパーサーが式の合計を「1 + 2 + 3」の形式で記述しています。
// 一般的なオプション、例えば、対象言語オプション{ language = "CSharp"; }// パーサークラスSumParserが続きます。SumParserはParserを継承します。options { k = 1 ; // パーサー先読み: 1 トークン}// 式ステートメントの定義: INTEGER ( PLUS ^ INTEGER )* ;// ここに Lexerクラスがあります。 SumLexer extends Lexer; options { k = 1 ; // Lexer 先読み: 1 文字} PLUS : '+' ; DIGIT : ( '0' .. '9' ) ; INTEGER : ( DIGIT )+ ;以下のリストは、プログラム内でパーサーを呼び出す例を示しています。
TextReader reader ; // (...) TextReader に文字を格納しますSumLexer lexer = new SumLexer ( reader ); SumParser parser = new SumParser ( lexer );パーサー.ステートメント();