Невозможно скомпилировать вывод lex - PullRequest
5 голосов
/ 10 апреля 2010

Когда я пытаюсь скомпилировать вывод этой тривиальной программы lex:

# lex.l
integer   printf("found keyword INT");

с помощью:

$ gcc lex.yy.c

Я получаю:

Undefined symbols:
  "_yywrap", referenced from:
      _yylex in ccMsRtp7.o
      _input in ccMsRtp7.o
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

lex --version говорит мне, что я на самом деле использую 'flex 2.5.35', хотя ls -fla `which lex` не является символической ссылкой. Есть идеи, почему вывод не скомпилируется?

Ответы [ 2 ]

20 голосов
/ 10 апреля 2010

С Флекс ручной :

Я получаю ошибку о неопределенном yywrap ().

Вы должны предоставить собственную функцию yywrap (), или ссылку на libfl.a (которая предоставляет такую ​​функцию), или использовать

%option noyywrap

в вашем источнике сказано, что вам не нужна функция yywrap ().

Также:

Когда сканер получает указание конца файла от YY_INPUT, затем проверяет функцию yywrap (). Если yywrap () возвращает false (ноль), тогда предполагается, что Функция пошла вперед и настроить Yyin, чтобы указать на другой входной файл, и сканирование продолжается. Если он вернется истина (не ноль), затем сканер завершает работу, возвращая 0 своему звонящему. Обратите внимание, что в любом случае остается неизменным; оно не возвращается к НАЧАЛЬНОМУ.

0 голосов
/ 10 апреля 2010

Как следует из ответа Эли, это не тривиальная программа lex. Это тривиальный файл lex , и, следовательно, часть программы, но его (как и любой файл lex) необходимо объединить с небольшим количеством кода C, чтобы создать законченную программу. В частности, вам все еще нужна функция main (которую вы пишете на C или C ++ или что-то в отдельном файле), и вам также нужно написать функцию yywrap, которая обеспечивает интерфейс между кодом lex и остальная часть вашего кода C.

...