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