0

プログラムで lex を使用していますが、助けが必要な問題に遭遇しました。

私のプログラムは、[something " something] の形式で入力を受け入れます。これは正しく機能しています。

ただし、[something"something] という形式も受け入れる必要があります。

すべての入力が (前処理のように) 実行される lex である種の最初のケースを作成し、その後、プログラムの残りの部分で同じ変更された入力を続行する方法はありますか?

これが私が話していることのようなものです:

%%
.* {
   do preprocessing
   }

something{
   return SOMETHING;
   }

\" {
   return QUOTE;
   }
%%
4

1 に答える 1

1

実際には、lex でプリプロセッサーを作成してビルド・システムに入れることもできますが、それはおそらくやり過ぎです!

開始条件を使用し、BEGIN でそれらを切り替え、最初に入力を解析し、次に unput を使用して文字をストリームにプッシュしてから、別の開始条件で結果を解析できます ( Flex のマニュアルを参照)。

私は最近、まさにそれを行う Python のような構成言語用のパーサーを作成しました。パーサーには 2 つのモード (開始条件) がありました。1 つは行頭のタブを数えて範囲を決定するモードで、もう 1 つは実際の解析を行うモードです。

これらの方法は問題ありませんが、通常、特に入力スキームがそれほど複雑でない場合は、より良い方法があります。

あなたのプログラムの [何か " 何か] と [何か" 何か] の間に文法的な違いはありますか? 空白を食べるルールでうまくいくでしょうか?

あなたの言語と文法についてもう少し説明していただけませんか....?

コメントの後:

わかりました。基本的に、SOMETHING と QUOTE の 2 つのトークンがあります。トークンが空白で区切られている場合は、次のことができます。

%%
\"     {
       //this will match a single quote
       return QUOTE;
       }

[^" \t\n\r]+   {
               //this will match a run of anything thats not a quote, space, tab or line ending
               return SOMETHING;
               }

[ \t\n\r]      {
               //do nothing: i.e. ignore whitespace
               }

%%

SOMETHING トークンの場合[A-Za-z_][A-Za-z0-9_]*、文字またはアンダースコアの後に 0 個以上の文字、アンダースコア、および数字が続くようなものと一致させることもできます。

それは役に立ちますか?

于 2009-03-24T18:03:28.967 に答える