1

flexでいくつかの正規表現とルールを定義しました。次に、次のような正規表現を記述します。定義したルールのいずれにも一致しない入力がある場合は、その入力を単純に出力します。どのルールとも一致しないため、自動的に印刷されると思われるかもしれませんが、そうではありません。私の例を考えてみましょう。次の正規表現を定義しました。

[a-zA-Z_]+[a-zA-Z0-9_]*    printf("%d tIDENT (%s)\n",lineNum,yytext);

このルールは識別子を定義します。識別子はアンダースコアまたは文字で始めることができ、文字、数字、およびアンダースコアの組み合わせです。

[0-9]+  printf("%d tPOSINT (%s)\n",lineNum,yytext,yytext);

このルールは正の整数を認識します。

これらが私の唯一のルールであり、入力がであると仮定します2a3。これは識別子ではなく、整数でもありません。しかし、私の出力は2整数を取り、次にa3識別子を取ります。ただ2a3、どのルールとも合わないので、そのまま印刷したいです。これどうやってするの?

4

1 に答える 1

1

どのルールとも一致しないため、自動的に印刷されると思われるかもしれません。

いいえ、そうは思いません。私の記憶が正しければ、入力がどのルールにも一致しない場合、「flexjamed」のようなエラーが出力されます。ただし、この場合、入力はルールと一致するため、発生しません。一致するはずがない場合は、それに応じてルールを変更してください。しかし、私はそれを残します。2の後にa3が続くのはとにかく正当な構文ではないので、パーサーにそれを処理させます。

紙詰まりメッセージを回避し、不一致を印刷するには、次のような最終ルールを追加する必要があります。

。{printf( "%s"、yytext); }。//またはあなたが望むものは何でも

また、空白ルールを追加する必要があります。

于 2013-02-27T21:50:12.723 に答える