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

Когда я компилирую вывод 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*&)’ 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>&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*&)’ 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 с разными подписями.

Что я должен делать?


person mtk358    schedule 14.04.2011    source источник
comment
Нам нужен файл lex. Командная строка, с помощью которой вы собирали файл lex, и командная строка, с помощью которой вы собирали исходный код C++.   -  person Martin York    schedule 15.04.2011


Ответы (2)


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

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

person Roddy    schedule 14.04.2011

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

 lang::lexyacc::yy_delete_buffer(yy_buffer_state*)

а также

 yy_delete_buffer(yy_buffer_state*)

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

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

 %option c++

вариант Flex, чтобы получить настоящий класс сканера C++.

person Antti Huima    schedule 14.04.2011
comment
Использование %option c++ для меня не вариант (не каламбур), потому что этот лексер используется с YACC. В любом случае, я дополнительно изучу файл. - person mtk358; 14.04.2011
comment
Кажется, что прототип находится вне какого-либо пространства имен, но определение находится внутри пространства имен. - person mtk358; 14.04.2011
comment
@antti.huima: потому что это часть более крупного проекта C++, и я должен включить в него заголовки C++. - person mtk358; 15.04.2011
comment
@ mtk358: %option C++ не мешает вам использовать код с yacc. - person Martin York; 15.04.2011
comment
@ mtk358 Является ли пространство имен lang::lexyacc чем-то, что ВЫ объявили? Я не могу найти это с помощью Google ... если это что-то из ваших заголовков, то это виновник. Включаете ли вы заголовок (вне исходников Flex), открывающий пространство имен lang::lexyacc? Скорее всего, он включается ПОСЛЕ объявления первого прототипа yy_delete_buffer, что вызывает конфликт. - person Antti Huima; 15.04.2011