Когда я пытаюсь скомпилировать вывод этой тривиальной программы закона:
# 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
закон - версия говорит мне, что я на самом деле использую 'гибкий провод 2.5.35', хотя ls-fla, 'какой закон' не является символьной ссылкой. Какие-либо идеи, почему вывод не скомпилирует?
Из руководства Flex:
Я получаю ошибку о неопределенном yywrap().
Вы должны предоставить собственную функцию yywrap(), или ссылаться на libfl.a (которая предоставляет такую функцию), или использовать
%option noyywrap
в вашем исходном тексте, чтобы сказать, что вам не нужна функция yywrap().
Когда сканер получает индикацию конца файла от YY_INPUT, он затем проверяет функцию yywrap(). Если yywrap() возвращает false (ноль), то считается, что функция функция пошла вперед и установила yyin для указания на другой входной файл, и сканирование продолжается. Если функция возвращает true (ненулевое значение), то сканер завершается, возвращая 0 своему вызывающему устройству. Обратите внимание, что в любом случае условие запуска условия запуска остаются неизменными; они не возвращаются к INITIAL.
Как следует из ответа Илая, это не тривиальная программа lex. Это тривиальный lex файл, и, таким образом, часть программы, но он (как и любой другой lex файл) должен быть объединен с некоторым кодом C, чтобы получилась полная программа. В частности, вам все еще нужна функция main
(которую вы напишете на C или C++ или еще как-то, в отдельном файле), и вам также нужно будет написать функцию yywrap
, которая обеспечивает интерфейс между lex-кодом и остальным вашим C-кодом.