1

字句解析プログラムがJava、C ++、Cなどの言語の特定のコードで検出できるエラーの例をいくつか挙げてください。

4

3 に答える 3

4

レクサーは、考えられる意味を持たない文字のシーケンスを検出できます(意味はパーサーによって決定されます)。たとえば、Javaでは、シーケンスbana"naを識別子、キーワード、演算子などにすることはできません。

ただし、レクサーは、特定の字句的に有効なトークンが無意味または非文法的であることを検出できません。したがって、たとえばJavaレクサーは、トークンのシーケンスを喜んで返し、final "banana" final "banana"キーワード、文字列定数、キーワード、および文字列定数をそれぞれ確認します。

于 2009-10-06T15:30:51.570 に答える
1

以下で説明する場合に加えて、ほとんどのコンパイラはレクサーでコメントも処理します。そのため、コメントに関するエラー(不適切にネストされている、閉じられていない)もここで検出できます。

もう1つの問題は、ユーザー定義のデータ型の場合です。これは、レクサーとパーサーで一緒に処理する必要があります。次のコードを検討してください。

typedef int myinteger; myinteger x;

2番目のステートメントでは、myintegerはデータ型であり、レクサーはmyintegerを識別子としてではなくデータ型として返す必要があります。これは通常、潜在的な識別子を、以前にパーサーによって入力されたユーザー定義のデータ型のリストと相互参照することによって行われます。

3番目の問題は、トークンのコンテキストに関するものです。C ++のような状況依存言語では、同じトークン(<など)の意味が異なる場合があります(テンプレートパラメーターの先頭よりも小さい)。これは、パーサーと連携して処理する必要もあります。パーサーは、現在の状態についてレクサーにフィードバックを与えることができます。

于 2009-10-09T20:34:13.443 に答える
0

文法を再確認していませんが、たとえば「2cat」のような文字列は、有効/期待/分類可能なトークンではないと思います。

于 2009-10-06T15:31:31.223 に答える