私は現在、システムソフトウェア開発のクラスに参加しています。架空のマシンのアセンブリ言語用の 2 パス アセンブラを作成しています。トークナイザーを実装し、このプログラムを抽象化して表現するために必要なすべてのクラスを実装しました。残っているのは (後のフェーズでコード ジェネレーターを実装する以外に) トークンを解析することだけです。ここで私は大きな問題を抱えています。私はこれを再帰降下パーサーとして実装することを選択しています。これは、私が現在経験している唯一の手法であるためです...しかし、構文エラーでアセンブリを停止することは許可されていません。たとえば、ユーザーが無効な構文でロード ワード命令を発行した場合、それを NOP に置き換えます。ユーザーが不適切なラベルを付けた場合は、単純に無視します。ユーザーが不明な文字を行に配置した場合、それらは破棄されます。
簡単そうに思えますが、これを実装すると、再帰降下パーサーの重要なルールの 1 つ (私が理解していること) を破ることになります。考えられる修正可能な構文エラーをすべて考慮する必要があるため、各関数は別の関数を呼び出す前に複数のトークンをプルします。アセンブリを停止することはできず、ユーザーが何をしようとしているのかをインテリジェントに判断するには、現在のコンテキストに関する十分な情報が必要なので、1 つの関数内で多くのことを処理する必要があります。
これにより、プログラムは真の再帰降下パーサーから半有限状態機械に変わります。私はこれをひどくやっているように感じますが、これを実装する方法が他にわかりません。誰か提案/アイデアはありますか?
ところで - ANTLR やその他のパーサー ジェネレーターなどのツールを使用することは許可されていません。
ありがとう。