以下は、FLEX プログラムのスニペットです。
%%
a |
ab |
abc |
abcd ECHO; REJECT;
.|\n printf("xx%c", *yytext);
%%
入力:
abcd
出力:
abcdabcabaxxaxxbxxcxxdxx
誰かがこの出力を取得する方法を説明できますか?
以下は、FLEX プログラムのスニペットです。
%%
a |
ab |
abc |
abcd ECHO; REJECT;
.|\n printf("xx%c", *yytext);
%%
入力:
abcd
出力:
abcdabcabaxxaxxbxxcxxdxx
誰かがこの出力を取得する方法を説明できますか?
REJECT
flex
の優先ルールを念頭に置いて、次のより良い一致に効果的にバックアップしflex
ます。
あなたの場合、文字列は、、または;abcd
と一致します。優先されるのは最も長いものです ( )。a
ab
abc
abcd
abcd
ECHO
アクションの前にREJECT
アクションがあるECHO
ため、一致が後で拒否されても、これが発生します。最終的にflex
は、デフォルトのルール (これも一致しa
ますが、ソース ファイルの後半にあります) にフォールバックしxxa
、文字を出力して受け入れます。これで、デフォルト ルール以外は一致しないため、次の 3 文字が一度に 1 つずつ一致します。
'\n'
s を stdout に書いていれば、これはおそらくもっと明確だったでしょう。