Flex & Bison: определить основную функцию в отдельном файле - PullRequest
4 голосов
/ 11 июля 2011

Я пытаюсь сделать небольшого переводчика, используя Flex и Bison.

Теперь у меня есть два файла: parser.l и parser.y.Обычно основная функция помещается в файл parser.y.Я хочу поместить основную функцию в другой файл main.cpp, чтобы мой пакет выглядел аккуратно.

#include "y.tab.h"

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

Но когда я скомпилировал, я получил ошибку:

undefined reference to `main'

Итак, я знаю, что что-то не так, чтобы включить y.tab.h.

Не могли бы вы, кто-нибудь сказать мне, как это сделать?

Решение

Я просто понялout: добавьте следующее в файл main.c:

    extern FILE *yyin;
    extern FILE *yyout;
    extern int yyparse(void);

1 Ответ

1 голос
/ 24 января 2015

ТАК отметил:

Я только что понял: добавьте следующее в файл main.c:

extern FILE *yyin; extern FILE *yyout; extern int yyparse(void);

@ Джонатан Леффлер отметил

Вам на самом деле не нужны yyin или yyout, так как вы не (пока) не ссылаетесь их из файла, содержащего main(). Тем не менее, если вы в конечном итоге делать работать, например, чтение из файлов, указанных в командной строке стандартного ввода, они могут вам понадобиться. Было бы хорошо, если бы Бизон сгенерировал заголовок с соответствующими объявлениями в нем. Файл y.tab.h, однако, не является местом для этой информации; это используется для передачи информации между синтаксическим анализатором и лексическим анализатор, а не между приложением и анализатором.

...