ホワイト理解するためのコンパイラコンパイラのフロントエンドツールを作成するための[6]シリーズ:ANTLR

我々はサポートのみの単純な計算とは、いくつかのキーワードを特定するという単純なコンパイラを完了したことを、コンパイラを作成するには、[白]シリーズによります。実用的なアプリケーションでは、これらの単純な字句や文法規則は、我々のニーズを満たすことができません。したがって、我々は、既製のフロントエンドツールの助けを必要としています。もちろん、コンパイラのフロントエンドツールは多くあり、私たちはANTLRを選んだ理由は、それができるということであるターゲット言語の広い範囲をサポートし、その構文がはるかに簡単です

ANTLR

ANTLRはに従ってオープンソースツールのサポートであるルールファイル自体が発生字句解析および構文解析器、のJava実装。"

ダウンロードサイト:https://www.antlr.org

リファレンス・コンフィギュレーション・ブログ:https://blog.csdn.net/u014454538/article/details/86316794

字句解析ANTLRの生成

ANTLRコンパイラの構文解析規則ファイルによって生成されますルールファイル .g4端は、字句規則や文法規則は、同じファイルに配置することができます。しかし、明確にするために、我々は字句規則にファイルを書き込むために、2つのファイルが、最初にそれらを分けます。 

Hello.g4は、我々はその後、以前にそれに書き込まれた字句規則の一部を使用し、字句のルールを保存するためのファイルを作成します。

lexer grammar Hello;  //lexer关键字意味着这是一个词法规则文件,名称是Hello,要与文件名相同

//关键字
If :               'if';
Int :              'int';

//字面量
IntLiteral:        [0-9]+;
StringLiteral:      '"' .*? '"' ;  //字符串字面量

//操作符
AssignmentOP:       '=' ;    
RelationalOP:       '>'|'>='|'<' |'<=' ;    
Star:               '*';
Plus:               '+';
Sharp:              '#';
SemiColon:          ';';
Dot:                '.';
Comm:               ',';
LeftBracket :       '[';
RightBracket:       ']';
LeftBrace:          '{';
RightBrace:         '}';
LeftParen:          '(';
RightParen:         ')';

//标识符
Id :                [a-zA-Z_] ([a-zA-Z_] | [0-9])*;

//空白字符,抛弃
Whitespace:         [ \t]+ -> skip;
Newline:            ( '\r' '\n'?|'\n')-> skip;

各見ることは非常に直感的にすることができ字句規則がある大文字で開始 ANTLR字句規則に規定されています、。

次に、にcmdと入力します。

antlr4 Hello.g4

このコマンドは、コンパイル済みのルールファイルをANTLRとHello.javaファイルと他の二つの書類を生成することです。あなたは、オープン内側へのファイルの内容を見ることができます。その後、私はHello.javaをコンパイルするには、次のコマンドを使用します。

javac *.java

この結果は、これが私たちの世代字句解析され、Hello.classファイルが生成されます。次に、我々は、およそので、生成された字句解析、分析、スクリプトファイルを記述します。

int age = 45;
if (age >= 17+8+20){
  printf("Hello old man!");
}

私たちは、スクリプトファイル上記hello.playとして保存され、その後、ターミナルで次のコマンドを入力します。

grun Hello tokens -tokens hello.play

GRUNコマンドは、実際にhello.play字句解析の結果をプリントアウトし、私たちはただ、すなわちHelloクラスを作成することを字句解析を呼び出します。

結果から見ると、私たちは各トークンを特定した字句解析器は、また、コード、テキスト値カテゴリに記録されています。これらは、トークンが上記の属性です。

第二列[@ 1、4:6 = '年齢'、<ID>、1:4] 例として、1 @これは数1トークンであることを示す、トークンのシリアル番号である; 4:6は、文字トークンであります開始位置と終了位置を流れ、年齢テキスト値であり、IDがトークンのカテゴリであり、最終的な1:4は、ソースコードの最初の行のトークン、最初の4つのことを示しています。

限り、私たちは私たちの良い字句ルールファイルを向上させるよう、我々は実用的な字句解析を行うことができるようになります、それは非常に単純ではないのですか?ここでは、成熟したルールファイルから学ぶ独自のルールがより完璧なファイルを作ることができます。

パーサANTLRの生成

この時間は、ファイル名はPlayScript.g4と呼ばれています。playscriptが、これはファイルの先頭で、私たちのスクリプト言語のために遊んだ名前です。

grammar PlayScript;
import CommonLexer;   //导入词法定义

/*下面的内容加到所生成的Java源文件的头部,如包名称,import语句等。*/
@header {
package antlrtest;
}

その後、我々はそれらに構文定義の前にいました。自動処理ANTLR左再帰のための内部メカニズムがあり、あなたが安全に、次のように書かれた文法規則を置くことができますが。

expression
    :   assignmentExpression
    |   expression ',' assignmentExpression
    ;

assignmentExpression
    :   additiveExpression
    |   Identifier assignmentOperator additiveExpression
    ;

assignmentOperator
    :   '='
    |   '*='
    |  '/='
    |   '%='
    |   '+='
    |   '-='
    ;

additiveExpression
    :   multiplicativeExpression
    |   additiveExpression '+' multiplicativeExpression
    |   additiveExpression '-' multiplicativeExpression
    ;

multiplicativeExpression
    :   primaryExpression
    |   multiplicativeExpression '*' primaryExpression
    |   multiplicativeExpression '/' primaryExpression
    |   multiplicativeExpression '%' primaryExpression
    ;

その後、我々はパーサを生成しました:

antlr PlayScript.g4
javac antlrtest/*.java

テストに続いて、:

grun antlrtest.PlayScript expression -gui

このコマンドの意味がある:式試験方法PlayScript解析式の方法であり、このクラスは、結果がグラフィカルインタフェースを示しています。

私たちは、コンソールインターフェイスで次のように入力します。

age + 10 * 2  + 10
^Z

 見ることができ、ASTは完全に正しい、優先順位と結合も大丈夫です。だから、ANTLR生成されたパーサはまだ非常にトリッキーです。その後、我々は言語の設計と応用に焦点を当てることができ、文法のルールを記述するためのラインに焦点を当てる必要があります。

公開された62元の記事 ウォン称賛34 ビュー20000 +

おすすめ

転載: blog.csdn.net/weixin_41960890/article/details/105238379