5

警告が表示されます

warning, -s option given but default rule can be matched

「オプションは指定されていますが、デフォルトのルールは一致する可能性があります」とグーグルで検索 すると、Flexマニュアルの診断に関する章と、診断セクションの古いFlexマンページのこのエントリが見つかります。

警告、「-s オプションが指定されましたが、デフォルト ルールを一致させることができます」は、(おそらく特定の開始条件でのみ) デフォルト ルール (任意の 1 文字に一致) が特定の入力に一致する唯一のものである可能性があることを意味します。が与えられたので-s、おそらくこれは意図したものではありません。

-s私のビルドファイルにはオプションがありません。私が書いた

bison -y -d calc1.y
flex calc1.l
gcc code...

この警告を修正するにはどうすればよいですか?

これは、私の lex ファイルの小さなバージョンです。このファイルも警告をトリガーします

%{
#include "y.tab.h"
%}
%option noyywrap nodefault yylineno

%%

[0-9]+      {
                return INTEGER;
            }

[-+()=/*{},;\n] { return *yytext; }

[ \t]       /* skip whitespace */

[a-zA-Z0-9_]* { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }

%%
4

2 に答える 2

4

%option nodefault は -s と同等です

于 2009-11-01T10:27:49.023 に答える
2

システムの「flex」コマンドは、-sオプションを指定したflexコマンドにエイリアスされている可能性があります。これは、いくつかの起動スクリプトのいずれかで発生する可能性があります。

警告は、入力ファイル内のどのルールとも一致しない入力があることを示しています。警告は、正規表現のすべてのケースを考慮したことを確認するためにあります。

本当にデフォルトのルールを使用したい場合は、それを入力ファイルのルールの最後に追加します。ルールを追加してみてください

. ECHO;
\n ECHO;

更新:提供する入力ファイルには、%option nodefaultが含まれています。これは、コマンドラインで「-s」を指定するのと同じであるため、謎が解決されます。また、ファイルには「。」のルールがありません。カバーされていない文字がいくつかあります。たとえば、「@」です。

また、文字クラスの「-」記号も疑わしいです。範囲演算子であるはずですが、最初の位置の文字として機能する場合があります。知らない。代わりに「\-」を使用することをお勧めします。

最後のルールを次のように変更できます

. { printf("lex Unknown character = '%s'", yytext); yyerror("lex Unknown character"); }

警告を取り除くため(そして結果のスキャナーがクラッシュするのを防ぐため)。

また、質問のタイトルをバイソンではなくフレックスに関するものに変更できますか?

于 2009-10-26T04:37:51.877 に答える