1

Flex のマニュアルに記載されているように、正規表現 (?rs:pattern) を使用しようとしています。

次のコードは、大文字の「A」ではなく小文字の「a」を入力した場合にのみ機能します

%%
[(?i:a)] { printf("color"); }
\n { printf("NEWLINE\n"); return EOL;}
. { printf("Mystery character %s\n", yytext); }
%%

出力

a
colorNEWLINE
A
Mystery character A
NEWLINE

逆もまた真です。つまり、行 (?i:a) を (?i:A) に変更すると、「a」ではなく「A」のみが有効な入力と見なされます。角括弧、つまり [] を削除すると、次のようなエラーが発生します

"ex1.lex", line 2: unrecognized rule

「(?i:a)」を囲むとコンパイルされますが、実行後は常に最後のルール、つまり「ミステリーキャラクター...」に移動します

正しい使い方を教えてください。

4

2 に答える 2

0

私は遅れていると思います..:)とにかく、どのflexバージョンを使用していますか、バージョンが2.5.35インストールされており、上記のパターンを正しく認識しています。おそらくあなたは古いバージョンを使用しています!!!

[次に、 ]括弧で囲むことについて。[]正規表現の規則に従って、個々の、、、、、またはのいずれかに一致しようとするため、これ(は機能します。それが認識され、認識されない理由です(リストにないため)。?i:a)aA

于 2012-05-26T15:16:17.763 に答える
0

私がマニュアルを読んだ方法では、角括弧のないルールは、探している大文字と小文字を区別しない一致を実行するはずです.コンパイル時にエラーが発生する理由を説明できません. ただし、2 つの方法のいずれかで同じ動作を実現できます。1 つ目は、文字クラスで大文字と小文字を列挙できます。

%%
[Aa] { printf("color"); }
%%

2 つ目は、大文字と小文字を区別しないスキャナー オプションを、コマンド ライン-iまたは--case-insensitive.l ファイルで指定できます。

%%
%option case-insensitive
[a] {printf("color"); }
%%
于 2012-06-18T14:12:47.810 に答える