フレックス デフォルト ルールは、単一の文字に一致し、それを標準出力に出力します。そのアクションが必要ない場合は、1 つの文字に一致し、別のことを行う明示的なルールを記述します。
パターン(.|\n)*
は入力ファイル全体を 1 つのトークンとして照合するため、これは非常に悪い考えです。デフォルトは長い一致である必要があると考えていますが、実際にはできるだけ短くする必要があります (ただし、空ではありません)。
デフォルト ルールの目的は、入力言語のどのトークンにも一致しない場合に何かを行うことです。言語をトークン化するために lex を使用する場合、このような状況はほとんど常に誤りです。これは、入力がその言語の有効なトークンの先頭ではない文字で始まることを意味するためです。
したがって、「任意の文字をキャッチ」ルールは、エラー回復の形式としてコーディングされます。アイデアは、悪い文字 (1 つだけ) を破棄し、その後の文字からトークン化を試みることです。これは推測にすぎませんが、既知の情報、つまり入力に 1 つの不適切な文字があることに基づいているため、適切な推測です。
リカバリ ルールが間違っている可能性があります。たとえば、言語のトークンが で始まらず@
、プログラマーが文字列リテラル を書きたいとします"@abc"
。ただ、彼女は冒頭を忘れて"
書い@abc"
た。正しい修正は"
、 を破棄するのではなく、欠落している を挿入すること@
です。しかし、そのためには、レクサーでより巧妙な一連のルールが必要になります。
とにかく、通常、悪い文字を破棄する場合、この場合は「42 行 3 列目の無効な文字 '~` をスキップします」のようなエラー メッセージを発行します。
一致しない文字を標準出力にコピーするデフォルトのルール/アクションは、テキスト フィルタリングに lex を使用する場合に役立ちます。次に、デフォルトのルールは、(正規表現の一致ではなく) 正規表現検索のセマンティクスをもたらします。アイデアは、その検索によってスキップされたすべての素材を出力しながら、レクサーのトークン認識ステート マシンの一致について入力を検索することです。
たとえば、ルールだけを含む lex 仕様は次のようになります。
"foo" { printf("bar"); }
同等のものを実装します
sed -e 's/foo/bar/g'