コンパイラ理論クラスでは、独自に設計したプログラミング言語用の単純なインタプリタを作成する必要があります。私はジェネレーターとしてjflexとcupを使用していますが、字句エラーが何であるかについて少し立ち往生しています。また、jflexの状態機能を使用することをお勧めしますか?パーサーがその側面を処理するのにより適しているように見えるので、それは間違っていると感じます。言語を作成するために他のツールをお勧めしますか。焦ってすみませんが火曜日の予定です。
字句エラーは、レクサーによって拒否される可能性のある入力です。これは通常、トークン認識が定義したルールの終わりから外れることに起因します。例(特定の構文ではありません):
[0-9]+ ===> NUMBER token
[a-zA-Z] ===> LETTERS token
anything else ===> error!
レクサーを有効な入力文字列を受け入れる有限状態マシンと考えると、エラーは、その有限状態マシンが受け入れ状態に到達しない入力文字列になります。
あなたの質問の残りは私にはかなり不明瞭でした。使用しているツールがすでにいくつかある場合は、それらのツールを使用して達成したいことを達成する方法を学ぶのがおそらく最善です(私はあなたが言及したツールのどちらも経験していません)。
編集:あなたの質問を読み直したので、私が答えることができる2番目の部分があります。言語に字句エラーがない可能性があります。これは、入力文字列がすべて有効な入力である言語です。
字句エラーは、Java(予約済み)の識別子の字句エラーとして拒否される '@'のように、言語によって無効または受け入れられない文字である可能性があります。
字句エラーは、続行できないときにレクサーによってスローされるエラーです。つまり、語彙素をレクサーの有効なトークンとして認識する方法はありません。反対側の構文エラーは、already認識された有効なトークンの特定のセットが右側のいずれにも一致しない場合に、スキャナーによってスローされます。あなたの文法規則の。
パーサーがその側面を処理するのにより適しているように見えるので、それは間違っていると感じます
いいえ。それはのようです。なぜなら 文脈自由言語には正規言語が含まれる (パーサーがレクサーの仕事をすることができるということを意味する)。ただし、パーサーはスタックオートマトンであり、スタックの認識を必要としないもの(正規表現)を認識するために、追加のコンピューターリソース(スタック)を使用することを考慮してください。それは次善の解決策になるでしょう。
注:正規表現とは、つまり... Java.util.regex.*
クラスではなく、チョムスキー階層の意味での正規表現です。
字句エラーは、入力が次のリストのいずれにも属していない場合です。キーワード:"if", "else", "main"...
記号:'=','+',';'...
二重記号:">=", "<=", "!=", "++"
変数:[a-z/A-Z]+[0-9]*
番号:[0-9]*
例:9var:エラー、文字の前の数字、変数でもキーワードでもありません。 $:エラー
私が知らないのは、「+-」のように、次々に複数の記号のようなものが受け入れられるかどうかです。
コンパイラは、文法が含まれているとエラーをキャッチできます。字句エラーをキャッチする能力(スコープ)があるかどうかは、コンパイラ自体に依存します。コンパイラの開発中に、どのタイプの字句エラーがどのように(文法に従って)処理されるかが決定された場合。通常、すべての有名でほとんど使用されているコンパイラにはこの機能があります。