5

Java私は学期プロジェクトのために基本的な字句解析器を作成していますが、教科の教師とコンセプトについて対立しています。

私の見解では、一般に、「1a」のような入力が字句解析器に与えられた場合、次のような出力が得られるはずです。

"<Number><Identifier>"

しかし、私の先生は、これを数字と識別子として扱うのではなく、文字列全体 (つまり "1a") をエラーとしてフラグ付けする必要があるため、これをエラーとしてフラグ付けする必要があると言っています。数字から始めます。

それどころか、何かが有効な識別子であるかどうかを判断するために、これはコンパイラの次の段階(構文解析器)の責任であるべきだと思います。数字で始まらない識別子について彼が正しいことは知っていますが、字句解析器がそれを決定する必要があるという部分で閉鎖が必要です。

私は本当にあなたの助けに感謝します. ありがとうございました

4

4 に答える 4

0

パーサーでこれを検出することは、識別子が後に続く数字がたまたま構文的に無効である文法に対してのみ機能します。1 aが言語で有効な構文である場合、パーサーは(空白なし) と(空白あり) を区別できないため、レクサーでこれを処理する必要があります。1a1 a

なぜレクサーでこれをしないのですか?レクサーの仕事は、パーサーの仕事を簡単にすることです。レクサー自体に多くの複雑さを追加することなく、パーサーを単純化するために実行できる作業はすべて良い考えです。

于 2013-06-01T00:03:09.190 に答える
0

この理由は、C の 1L がデフォルトの int 型ではなく long 型の値 1 であるように、言語では数値に接尾辞を使用することが多いためです。また、後から言語で接尾辞を追加できるようにしたいと考えています。あなたの1aを考えてみましょう。最初に、これは int 値 1 として解析され、その後に識別子 a が続きます。しかし今、コンパイラの作成者は、数字の接尾辞として a を使い始めることにしました。突然 1a が 1 つのトークンになります。

1a の場合、1a は 16 進数として意味される可能性があるという特殊なケースもありますが、C では必要な接尾辞/接頭辞 0x1a または特定のアセンブラ バージョンでは 1ah を付けるのを忘れていました。

于 2013-05-29T17:25:00.840 に答える