Ошибка множественного определения lex & yacc - PullRequest
0 голосов
/ 03 мая 2018

Я хочу сделать сканер кода и анализатор, но я не знаю, почему эта ошибка происходит, просто просматривая журнал ошибок. Сканер берет пример кода и делит его на токены, а затем возвращает то, что делает каждый из токенов в коде. Парсер получает значения, возвращаемые сканером, и анализирует код в соответствии с правилами. Проверяет правильность грамматики примера кода.

и, наконец, это моя ошибка

lex.yy.o: In function main:
lex.yy.c:(.text+0x1d2a): multiple definition of main
y.tab.o:y.tab.c:(.text+0x861): first defined here
collect2: error: ld returned 1 exit status

1 Ответ

0 голосов
/ 03 мая 2018

Вы определили main в обоих ваших файлах, но C допускает только одно определение main в программе, о чем говорит вам ошибка компоновщика.

main в вашем файле сканера имеет недопустимый прототип (C почти два года не допускает определения функций без возвращаемого типа), а также вызывает yylex только один раз, что мало что даст. Так что это выглядит довольно хорошо, бессмысленно. Если вы хотите отладить ваш сканер без использования парсера, вы можете связать сканер с -lfl; эта библиотека содержит определение main, которое неоднократно вызывает yylex до тех пор, пока не будет сообщено конец файла.

Вместо того, чтобы рассеивать вызовы printf через ваш сканер, вы можете просто создать отладочную версию сканера, используя флаг --debug при создании сканера. Это распечатает след всех действий сканера.

...