私は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バイトコードにコンパイルされているので、任意のクラスを型として認識するために必要です。
だから私の質問は:すべての可能な変数型を知らなくても、ステートメントが変数宣言であるかどうかを判断することは可能ですか?