Не удалось скомпилировать вывод lex

Когда я пытаюсь скомпилировать вывод этой тривиальной программы 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 `what lex` не является символической ссылкой. Любые идеи, почему вывод не будет компилироваться?


person dstnbrkr    schedule 10.04.2010    source источник


Ответы (2)


Из руководства по Flex :

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

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

%option noyywrap

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

Также:

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

person Community    schedule 10.04.2010
comment
+1 за упоминание ссылки на libfl.a, которая предоставляет тривиальные main(), а также yywrap(): просто создайте с использованием $ gcc lex.yy.c -lfl. - person Matthew Slattery; 10.04.2010
comment
В Mac есть libl.a, выполняющая ту же функцию, что и libfl.a, поэтому скомпилируйте с параметром -ll. - person Yash; 16.08.2014

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

person Brooks Moses    schedule 10.04.2010