5

構文解析と意味解析がどのように機能するのか疑問に思っています。

インタプリタのレクサーと文法の構築を終了しました。

次に、この文法の再帰降下 (トップダウン) パーサーを実装します。

たとえば、次の文法があります。

<declaration>  ::=   <data_type> <identifier> ASSIGN <value>

だから私はそれを次のようにコーディングしました(Javaで):

public void declaration(){
    data_type();
    identifier();
    if(token.equals("ASSIGN")){
        lexer();   //calls next token
        value();
    } else {
        error();
    }
}

Int、String、Boolean の 3 つのデータ型があるとします。各データ型の値は異なるため (例: ブール値のみの true または false)、データ型に正しく適合するかどうかをどのように判断できますか? 私のコードのどの部分がそれを決定しますか?

私はコードをどこに置くのだろうかと思っています:

1.) call the semantic analysis part of my program. 
2.) store my variables into the symbol table.

構文解析と意味解析は同時に行われますか? または、最初に構文解析を終了してから意味解析を行う必要がありますか?

私は本当に混乱しています。助けてください。

ありがとうございました。

4

2 に答える 2

3

構文解析 (構文解析) と意味解析 (例えば、 と の間の一致のチェック)を同時に行うことができます。たとえば、declaration() が data_type() を呼び出すと、後者は、宣言された型が Int、String、または Boolean のいずれであるかを示す何か (DT と呼びます) を返すことができます。同様に、value() は、解析された型を示す何か (VT) を返すことができます。その後、declaration() は単純に DT と VT を比較し、一致しない場合はエラーを発生させます。(代わりに、value() は、宣言された型を示すパラメーターを取り、チェックを行うことができます。)<data_type><value>

ただし、2 つのフェーズを完全に分離する方が簡単な場合があります。そのためには、通常、解析フェーズで解析ツリー(または抽象構文ツリー) を構築します。したがって、トップレベルは (たとえば) program() を呼び出してプログラム全体を解析し、プログラム (の構文) を表すツリーを返し、そのツリーを semantic_analysis() ルーチンに渡し、ツリーをトラバースします。 、関連情報を抽出し、意味上の制約を適用します。

于 2013-10-02T18:38:58.743 に答える