2 つの排他的な状態 (WORD と DEFN) を維持するスキャナーがあります。
%option noyywrap
%s WORD
%s DEFN
%%
%{
BEGIN(WORD);
%}
<WORD>{
"|" { BEGIN(DEFN); return WS_PIPE; }
}
<DEFN>{
[^;]+ { printf("ds: %s\n", yytext); return WD_STRING; }
";" { return WD_SEMICOLON; }
}
\n|. { printf("U: %s\n", yytext); }
%%
しかし、単純な入力 "| some text;" では、パイプが解析されるときに状態が変更されていないため、"some text;" の解析が行われます。失敗します。