Ошибка компиляции выходных данных Lex в C

#c #lex #flex-lexer

#c #lex #flex-lexer

Вопрос:

Когда я компилирую выходные данные Lex в C , я получаю эти ошибки:

 $ make
[  6%] Building CXX object lib/CMakeFiles/lang.dir/lex_lexer.cpp.o
/home/michael/Projects/lang/build/lib/lex_lexer.cpp: In function ‘int lang::lexyacc::yylex()’:                                         
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:789:1: warning: label ‘find_rule’ defined but not used
/home/michael/Projects/lang/build/lib/lex_lexer.cpp: In function ‘void lang::lexyacc::yypop_buffer_state()’:
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1542:37: error: call of overloaded ‘yy_delete_buffer(yy_buffer_state*)’ is ambiguous
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1427:10: note: candidates are: void lang::lexyacc::yy_delete_buffer(yy_buffer_state*)
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:303:6: note:                 void yy_delete_buffer(yy_buffer_state*)
/home/michael/Projects/lang/build/lib/lex_lexer.cpp: In function ‘yy_buffer_state* lang::lexyacc::yy_scan_buffer(char*, yy_size_t)’:
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1629:25: error: call of overloaded ‘yy_switch_to_buffer(yy_buffer_state*amp;)’ is ambiguous
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1354:10: note: candidates are: void lang::lexyacc::yy_switch_to_buffer(yy_buffer_state*)
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:301:6: note:                 void yy_switch_to_buffer(yy_buffer_state*)
/home/michael/Projects/lang/build/lib/lex_lexer.cpp: In function ‘int lang::lexyacc::yylex_destroy()’:
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1834:39: error: call of overloaded ‘yy_delete_buffer(yy_buffer_state*)’ is ambiguous
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1427:10: note: candidates are: void lang::lexyacc::yy_delete_buffer(yy_buffer_state*)
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:303:6: note:                 void yy_delete_buffer(yy_buffer_state*)
/home/michael/Projects/lang/build/lib/lex_lexer.cpp: At global scope:
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:308:13: warning: ‘void yyensure_buffer_stack()’ declared ‘static’ but never defined
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:309:13: warning: ‘void yy_load_buffer_state()’ declared ‘static’ but never defined
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:310:13: warning: ‘void yy_init_buffer(yy_buffer_state*, FILE*)’ declared ‘static’ but never defined
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:361:22: warning: ‘yy_state_type yy_get_previous_state()’ declared ‘static’ but never defined
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:362:22: warning: ‘yy_state_type yy_try_NUL_trans(yy_state_type)’ declared ‘static’ but never defined
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:363:12: warning: ‘int yy_get_next_buffer()’ declared ‘static’ but never defined
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:364:13: warning: ‘void yy_fatal_error(const char*)’ declared ‘static’ but never defined
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1212:17: warning: ‘void lang::lexyacc::yyunput(int, char*)’ defined but not used
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1867:12: warning: ‘int lang::lexyacc::yy_flex_strlen(const char*)’ defined but not used
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1162:26: warning: ‘yy_state_type lang::lexyacc::yy_get_previous_state()’ defined but not used
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1193:26: warning: ‘yy_state_type lang::lexyacc::yy_try_NUL_trans(yy_state_type)’ defined but not used
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1450:17: warning: ‘void lang::lexyacc::yy_init_buffer(yy_buffer_state*, FILE*)’ defined but not used
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1556:13: warning: ‘void lang::lexyacc::yyensure_buffer_stack()’ defined but not used
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1689:13: warning: ‘void lang::lexyacc::yy_fatal_error(const char*)’ defined but not used
make[2]: *** [lib/CMakeFiles/lang.dir/lex_lexer.cpp.o] Error 1
make[1]: *** [lib/CMakeFiles/lang.dir/all] Error 2
make: *** [all] Error 2
  

Фактические ошибки заключаются в следующем:

 $ make 2>amp;1 | grep 'error:'
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1542:37: error: call of overloaded ‘yy_delete_buffer(yy_buffer_state*)’ is ambiguous
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1629:25: error: call of overloaded ‘yy_switch_to_buffer(yy_buffer_state*amp;)’ is ambiguous
/home/michael/Projects/lang/build/lib/lex_lexer.cpp:1834:39: error: call of overloaded ‘yy_delete_buffer(yy_buffer_state*)’ is ambiguous
  

Но я просмотрел файл, и там нет нескольких определений yy_delete_buffer с разными сигнатурами.

Что мне делать?

Комментарии:

1. Нам нужен файл lex. Командная строка, которую вы использовали для создания файла lex, и командная строка, которую вы используете для создания исходного кода C .

Ответ №1:

Две функции-кандидата имеют идентичные подписи, но находятся в разных пространствах имен.

Все, что я могу предположить, это то, что каким-то образом возникла путаница в прямом определении функции, помещающей (или не помещающей) ее в lang::lexyacc пространство имен.

Ответ №2:

Хм, это выглядит как странная проблема с пространством имен, у вас есть два объявления в двух разных пространствах имен, например

  lang::lexyacc::yy_delete_buffer(yy_buffer_state*)
  

и

  yy_delete_buffer(yy_buffer_state*)
  

У них одинаковые списки аргументов, но они находятся в разных пространствах имен, другой в lang::lexyacc, другой по умолчанию.

Если вы не можете найти причину этого, вы можете указать

  %option c  
  

возможность сгибать, чтобы получить реальный класс C scanner.

Комментарии:

1. Использование %option c для меня не вариант (без каламбура), потому что этот лексер используется с YACC. В любом случае, я продолжу изучать файл.

2. Кажется, что прототип находится за пределами любого пространства имен, но определение находится внутри пространства имен.

3. @antti.huima: потому что это часть более крупного проекта на C , и я должен включить в него заголовки C .

4. @ mtk358: Параметр % C не останавливает использование кода с yacc.

5. @mtk358 Является ли пространство имен lang::lexyacc чем-то, что ВЫ объявили? Я не могу найти это с помощью Google… если это что-то, что исходит из ваших заголовков, то это виновник. Вы включаете заголовок (вне источников Flex), который открывает пространство имен lang::lexyacc? Скорее всего, это включено ПОСЛЕ объявления первого прототипа для yy_delete_buffer, что вызывает конфликт.