2

以下は、FLEX プログラムのスニペットです。

%%
a     |
ab    |
abc   |
abcd  ECHO; REJECT;
.|\n  printf("xx%c", *yytext);
%%

入力:

abcd

出力:

abcdabcabaxxaxxbxxcxxdxx

誰かがこの出力を取得する方法を説明できますか?

4

1 に答える 1

5

REJECTflexの優先ルールを念頭に置いて、次のより良い一致に効果的にバックアップしflexます。

  1. 可能な限り長いトークンに一致します。
  2. 同じ長さのトークンのうち、ソース ファイルで前にあるパターンを優先します。

あなたの場合、文字列は、、または;abcdと一致します。優先されるのは最も長いものです ( )。aababcabcdabcd

ECHOアクションの前にREJECTアクションがあるECHOため、一致が後で拒否されても、これが発生します。最終的にflexは、デフォルトのルール (これも一致しaますが、ソース ファイルの後半にあります) にフォールバックしxxa、文字を出力して受け入れます。これで、デフォルト ルール以外は一致しないため、次の 3 文字が一度に 1 つずつ一致します。

'\n's を stdout に書いていれば、これはおそらくもっと明確だったでしょう。

于 2012-10-31T20:22:53.103 に答える