2

1つの単純なプログラミング言語用のレクサーを作成しました。現在、正規表現(JavaではRegEx)の代わりに、決定性有限オートマトンを使用しています。オートマトンは、たとえばソースコードにmoduleclouds(モジュールとクラウドの両方がキーワード)がある場合にエラーを報告しないことを除いて、うまく機能します。代わりに、KW_MODULEとKW_CLOUDSという2つのトークンを作成します。オートマトンがKW_MODULEの最終状態にある場合、空白を先読みできると主張する人もいるかもしれません。しかし、それでは問題は解決しません。言語では、8-6(空白で区切られていない)のようなものがあり、トークンINTDASHINTに正しく変換される可能性があるためです。

パーサーの文法で空白を処理するのは良い考えではないことを私は知っています。

私のオートマトンはマトリックスとして実装されています(行は状態、列はアルファベットの文字、セルは遷移状態です)。オートマトンが最終状態になったら、オートマトンをリセットして開始状態から開始します。

問題は、このプログラミング言語がセミコロンを使用していないためだと思います。例えば:

モジュール; 雲;

代わりに、線を区切るために空白を使用します:モジュールクラウド

前もって感謝します。

よろしく。

4

1 に答える 1

1

FWIW、私が取り組んできたパーサーは、キーワードが文法で定義されている適切な識別子でもあることを要求することで、この問題に対処しています。

したがって、たとえば、オプションでさらに文字または数字が続く文字として定義された識別子がある場合、キーワードもその型に適合する必要があります。lexer は、トークンが既に ident として分類されている場合にのみ、トークンを潜在的なキーワードと見なします。

ただし、他の人がこの問題にどのように対処しているかを聞くことに興味があります。

于 2012-05-16T18:34:47.603 に答える