さて、あなたは実際のlexでプリプロセッサを書いて、あなたのビルドシステムにそれを置くが、thatsのおそらくやりすぎでした!
開始条件を使用して開始条件をBEGINで切り替え、入力を最初に解析し、次にunputを使用して文字をストリームにプッシュし、別の開始条件で結果を解析できます(the Flex manualを参照)。
最近、私はちょうどそれをしたpythonのような設定言語用のパーサーを書いています。パーサーには2つのモード(開始条件)があり、1つはラインの始めにタブを数えてスコープを決定し、もう1つは実際の解析を行います。
これらのメソッドは問題ありませんが、通常、入力スキームが非常に複雑でない場合は、通常、より良い方法があります。
あなたのプログラムの[何か]と[何か]の間には文法的に違いがありますか?空白を食べるルールがそのトリックですか?
あなたの言語と文法をもう少し詳しく説明できますか?コメントの後
:
オクラホマので、基本的には2つのトークン、SOMETHINGとQUOTEを持っています。あなたの何かのために
%%
\" {
//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
}
%%
あなたはまた、文字または0以上の文字、アンダースコアと数字が続くアンダースコアに一致します[A-Za-z_][A-Za-z0-9_]*
のようなものが一致する可能性がトークン:あなたのトークンは空白で区切られている場合は、次を行うことができます。
これは役に立ちますか?
基本的には、単語と引用符が1つの巨大トークンではなく、別々のトークンとして認識されるように、空白を追加する必要があります。 – samoz