Возникли проблемы при использовании gperf: пустое ключевое слово не допускается
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
Только чтобы получить:
Пустое ключевое слово ввода не допускается. Чтобы распознать пустое ключевое слово ввода, ваш код должен проверить len == 0 перед вызовом сгенерированной gperf поисковой функции.
Версия: GNU gperf 3.0.1 Почему?
3 ответа
Я обнаружил, что gperf 2.7 не заботит, есть ли разделитель "%%" между первым разделом и ключевыми словами. 3.0.1 строго соблюдает это. Итак, в моем случае я должен был изменить:
%{
#include <string.h>
%}
scan
быть
%{
#include <string.h>
%}
%%
scan
Я верю, что ваш случай отличается от того, что в руководстве говорится, что первое поле структуры должно называться name.
"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."
-Чарли
Я обнаружил, что gperf не любит пустые строки в разделе ключевых слов. Я думаю, он рассматривает пустую строку как пустую строку, поскольку это не комментарий, и жалуется на то, что она "пустая" и имеет len=0. Так как у меня есть привычка всегда заканчивать файл пустой строкой (есть некоторые ассемблеры и компиляторы, которые оплакивают отсутствие этого), это всегда было проблемой!
В дополнение к проблеме пустой строки, упомянутой Ричардом, gperf также не любит пробелы, предшествующие определенным токенам. (Я вырезал и вставил простой пример gperf, который искал "грубые" слова в пользовательском вводе. Имя образца было rude-1.gperf. В этом образце имелось отступ, который вызвал эту же ошибку.)