0

command_options.gperf:

%{
#include "command_options.h"
typedef struct CommandOptionCode CommandOptionCode;
%}
struct CommandOption
  {
  const char *Option;
  int OptionCode;
  };
%%
+helpverbose, CommandOptionCode::HELPVERBOSE
+password, CommandOptionCode::PASSWORD
+nocopyright, CommandOptionCode::NOCOPYRIGHT
+nolog, CommandOptionCode::NOLOG
+_64bit, CommandOptionCode::_64BIT

command_options.h:

#ifndef __COMMANDOPTIONS_H
#define __COMMANDOPTIONS_H
struct CommandOptionCode 
  {
  enum 
    {
    HELPVERBOSE = 1,
    PASSWORD = 2,
    NOCOPYRIGHT = 3,
    NOLOG = 4,
    _64BIT = 5
    };
  };
#endif

私が実行すると:

gperf  -L C++ -t --output-file=perfecthash.hpp command_options.gperf

取得のみ:

空の入力キーワードは許可されていません。空の入力キーワードを認識するには、gperf によって生成されたルックアップ関数を呼び出す前に、コードで len == 0 をチェックする必要があります。

バージョン: GNU gperf 3.0.1 なぜ?

4

3 に答える 3

1

gperf はキーワード セクションの空行を好まないことがわかりました。空白行はコメントではないため、私が推測するヌル文字列として扱い、「空」であり、len = 0であると不平を言います。私はいつもファイルを空行で終わらせる癖があるので (空行がないと失敗するアセンブラやコンパイラがいくつかあります)、それは常に問題でした!

于 2011-10-26T09:28:15.883 に答える
1

gperf 2.7 は、最初のセクションとキーワードの間に '%%' 区切り文字があるかどうかを気にしないことを発見しました。3.0.1 はこれを厳密に強制します。したがって、私の場合、次のように変更しました。

%{
#include <string.h>
%}

scan

することが

%{
#include <string.h>
%}
%%

scan

あなたの場合は、構造体の最初のフィールドを「名前」と呼ぶ必要があるとマニュアルに記載されているという点で、私は信じています。

"This first field must be called `name', although it is possible to modify its name with the `-K' option (or, equivalently, the `%define slot-name' declaration) described below."

-チャーリー

于 2011-04-19T20:45:50.007 に答える
0

Richard が言及した空白行の問題に加えて、gperf は特定のトークンの前にあるスペースも好みません。(ユーザーの入力に含まれる「無礼な」単語を探す単純な gperf サンプルをカット アンド ペーストしました。サンプルの名前は rude-1.gperf でした。サンプルには、同じエラーを引き起こすインデントがいくつかありました。)

于 2013-08-14T08:09:55.457 に答える