Гибкий - нет точки входа

Я изучаю теорию компиляции и как работать с flex, и у меня есть несколько проблем.

Я создал файл lex со следующими данными:

%%
"hello"     printf("GOODBYE");
.   ;
%%

Это самый простой, о котором я мог подумать. Если я правильно понимаю, он печатает GOODBYE каждый раз, когда встречает токен приветствия и игнорирует все остальное.

Я использовал flex для этого файла lex для генерации файла C, и теперь я должен скомпилировать этот код C, чтобы получить лексический анализатор для этой грамматики.

Проблема в том, что сгенерированный код C не имеет точки входа. Он не компилируется. Мой файл.lex неверный? Я что-то неправильно понимаю?

2 ответа

Решение

Вам нужно просто заявить о себе main() в этом файле после второго %% или связать этот.c с другим файлом.c где main() declareted.

%%
"hello"     printf("GOODBYE");
.   ;
%%

int main()
{
    yylex();
    return 0;
}

Проблема в том, что сгенерированный код C не имеет точки входа. Он не компилируется.

Нет, это не ссылка.

Мой файл.lex неверный?

Нет.

Я что-то неправильно понимаю?

Да.

"Точка входа" - это способ линкера сказать функцию main(), Flex генерирует код только для функции лексического анализатора, поэтому, если вам нужна полная программа, вам нужно предоставить main по отдельности. Это уместно, потому что чаще всего функция lexer используется в контексте более крупной программы, где функция lexer - единственное, что нужно или требуется от Flex.

Если все, что вы хотите, чтобы программа делала, это описывалось вашими правилами лексического анализа, тогда вам нужна основная функция, которая многократно вызывает функцию лексического анализа, yylex()До тех пор, пока не вернет ненулевое значение. Вы можете написать свой собственный, но вам не нужно этого делать - flex поставляется с библиотекой времени выполнения, libfl, основной целью которой является предоставление именно такой main, Вам просто нужно связать это, вероятно, добавив -lfl до конца вашей команды компиляции / ссылки.

Другие вопросы по тегам