1

私はJavaに似た言語用の単純なパーサーを作成しています(学習目的のためだけです)。ステートメントが変数宣言であるかどうかを判断するのに問題があります。これは私のレクサーの問題かもしれません(これは本当にずさんです)。レクサーがテキストを検出すると、そのテキストがキーワードまたはタイプであっても、単に識別子にラベルを付けます。それらを区別する仕事はパーサーに与えられます。

これはこれまで機能していましたが、今は次のような変数宣言を解析しようとしています。

int x = 3;

問題は、これが変数宣言であるかどうかを判断する方法がわからないことです。最初のトークンを見て、それが「識別子」であることがわかった場合、このコード行も識別子で始まるため、何もわかりません。

System.out.print("hi");

そして、このようなステートメントは、パーサーの別の部分によって処理されます。

私が考えたもう1つの解決策は、最初のトークンが型であるかどうかを確認することでした。たとえば、次のようなメソッドを作成できます。

boolean isType(String t) {
    if( t.equals("int")  ||
        t.equals("long") ||
        t.equals("char") ||
        /* et cetera */ )
        return true;
    else return false;
} 

これに伴う問題は、特定のタイプのセットしか許可されないことです。私の小さな言語はJavaバイトコードにコンパイルされているので、任意のクラスを型として認識するために必要です。

だから私の質問は:すべての可能な変数型を知らなくても、ステートメントが変数宣言であるかどうかを判断することは可能ですか?

4

4 に答える 4

2

もう1つの解決策は、シンボルテーブルを使用してパーサーとレクサーを連携させることです。パーサーは、新しいタイプ名が宣言されていると判断すると、その名前をタイプ名としてシンボルテーブルに挿入します。次に、レクサーはシンボルテーブルを参照して、新しい識別子のような単語がタイプ名であるかどうかを確認し、それに応じて正しいトークンタイプを選択します。

ただし、問題があります。

  • 言語が内部スコープでタイプ名を別のタイプの名前または非タイプ識別子として再定義できる場合、シンボルテーブルはスコープを理解する必要があり、パーサーはスコープが終了したときにシンボルテーブルに通知する必要があります。
  • 言語がタイプ名を一部のコンテキストで通常の識別子にすることを許可している場合、パーサーはそれに対処できなければなりません。
  • パーサーがバックトラックする場合は、シンボルテーブルの変更も元に戻すことを忘れないでください。

レクサーがコンテキストを認識しないほどクリーンではありませんが、その見返りとして(場合によっては)、パーサーが過度の先読みやバックトラックを回避できるようになります。ただし、Javaパーサーは必ずしもそのような支援を必要としないと思います。

于 2012-08-09T06:55:48.640 に答える
1

最初の単語を読んだとき、それが宣言であるかどうかはわかりませんが、そうする必要はありません。

次のセパレーターを入手すると、それが何のためにあるかがわかります。

于 2012-08-08T19:39:36.797 に答える
1

約4年前、私はクラスのためにこの味の何かをしなければなりませんでした。私はそれを行うための「公式の」方法のすべての詳細を覚えていませんが、

私がすることは、将来のシンボルを見て、それが変数宣言であるかどうかを判断することです。前述のようBenjamin Gruenbaumに、(行の先頭に)正当な識別子の後に別の正当な識別子が続く場合は、最初のものはおそらく変数宣言です。

于 2012-08-08T19:39:47.347 に答える
1

コンパイラの設計に関する本を読んで、これを試す前にlexとyaccのコードを確認する必要があります。または、コンパイラをグーグルで書くことができます

IIRC、そしてしばらく経ちましたが、最初にソースファイルを解析ツリーに分割し、次に解析ツリーを歩いてオブジェクトコードを生成します。ソースファイルを分解するときは、各トークンをキーワードトークンのリストと照合します。

あなたの例では、レクサーは'int'を見てそれを処理し、キーワードの後に​​続く必要がある(または言語定義によってはその前にある)変数宣言を探します。

これにより簡単に見えますが、ほとんどの人がフレックスやレックスなどのツールを使用して解析ツリーを作成するのには理由があります。

于 2012-08-08T19:40:02.987 に答える