yylex
を呼び出すと、現在のバッファポインタから始まる最長一致がになります。それはトークンを検索しません。ルールがスペース文字と一致することができるならば、それはスペースにマッチします。
Lexは「token
」が「ルールと一致する文字のシーケンス」以外であることを知らないので、ルールがトークン以上に及ぶ可能性があるかどうかは意味がありません。定義によれば、ルールと一致するものはすべてトークンです。
スキャナは現在のバッファポインタで開始しないものと決して一致しないので、常に一致するルールがいくつか存在する必要があります。デフォルトでは、lexは末尾に任意の文字に一致するルールを追加し(必要に応じて)、yyout
にエコーします。あなたは、トランスデューサを書いている場合を除き、それはあなたが望むものをほぼ確実ではないので、私はいつも(あなたが実際にこれまでで最も一般的なのlexの実装である、flex
を使用していると仮定して)あなたは
%option nodefault
を追加することをお勧めします。これはデフォルトルールを抑制し、入力と一致するルールがない可能性がある場合は警告を表示します。次に、独自のフォールバックルールを定義できます。
.|\n { return yytext[0]; }
またはスキャナエラーが発生する可能性があります。