字句解析プログラムがJava、C ++、Cなどの言語の特定のコードで検出できるエラーの例をいくつか挙げてください。
3 に答える
レクサーは、考えられる意味を持たない文字のシーケンスを検出できます(意味はパーサーによって決定されます)。たとえば、Javaでは、シーケンスbana"na
を識別子、キーワード、演算子などにすることはできません。
ただし、レクサーは、特定の字句的に有効なトークンが無意味または非文法的であることを検出できません。したがって、たとえばJavaレクサーは、トークンのシーケンスを喜んで返し、final "banana" final "banana"
キーワード、文字列定数、キーワード、および文字列定数をそれぞれ確認します。
以下で説明する場合に加えて、ほとんどのコンパイラはレクサーでコメントも処理します。そのため、コメントに関するエラー(不適切にネストされている、閉じられていない)もここで検出できます。
もう1つの問題は、ユーザー定義のデータ型の場合です。これは、レクサーとパーサーで一緒に処理する必要があります。次のコードを検討してください。
typedef int myinteger; myinteger x;
2番目のステートメントでは、myintegerはデータ型であり、レクサーはmyintegerを識別子としてではなくデータ型として返す必要があります。これは通常、潜在的な識別子を、以前にパーサーによって入力されたユーザー定義のデータ型のリストと相互参照することによって行われます。
3番目の問題は、トークンのコンテキストに関するものです。C ++のような状況依存言語では、同じトークン(<など)の意味が異なる場合があります(テンプレートパラメーターの先頭よりも小さい)。これは、パーサーと連携して処理する必要もあります。パーサーは、現在の状態についてレクサーにフィードバックを与えることができます。
文法を再確認していませんが、たとえば「2cat」のような文字列は、有効/期待/分類可能なトークンではないと思います。