1つの単純なプログラミング言語用のレクサーを作成しました。現在、正規表現(JavaではRegEx)の代わりに、決定性有限オートマトンを使用しています。オートマトンは、たとえばソースコードにmoduleclouds(モジュールとクラウドの両方がキーワード)がある場合にエラーを報告しないことを除いて、うまく機能します。代わりに、KW_MODULEとKW_CLOUDSという2つのトークンを作成します。オートマトンがKW_MODULEの最終状態にある場合、空白を先読みできると主張する人もいるかもしれません。しかし、それでは問題は解決しません。言語では、8-6(空白で区切られていない)のようなものがあり、トークンINTDASHINTに正しく変換される可能性があるためです。
パーサーの文法で空白を処理するのは良い考えではないことを私は知っています。
私のオートマトンはマトリックスとして実装されています(行は状態、列はアルファベットの文字、セルは遷移状態です)。オートマトンが最終状態になったら、オートマトンをリセットして開始状態から開始します。
問題は、このプログラミング言語がセミコロンを使用していないためだと思います。例えば:
モジュール; 雲;
代わりに、線を区切るために空白を使用します:モジュールクラウド
前もって感謝します。
よろしく。