実際には、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 個以上の文字、アンダースコア、および数字が続くようなものと一致させることもできます。
それは役に立ちますか?