Функция main () в файле зубров не работает - PullRequest
0 голосов
/ 11 ноября 2018

Итак, я пытаюсь создать компилятор, используя flex, bison и C. В моем файле step3.y есть основная функция:

step3.y

int main(int argc, char *argv[]) {
    char filename[100];
    strcpy(filename, argv[1]);
    if (argc == 2) {
        yyin = fopen(argv[1], "r");
        printf("filename is %s\n", filename);
    }
    else {
        printf("No files - Exit\n");
        exit(1);
    }
    yyparse();
    printf("\nMain symbol table");
    Display();
    printf("the input has been syntactically checked\n");
    printf("starting print\n*\n*\n*\n*\n*\n");
    ASTprint(0, prog);
    return 0;
}

И я запускаю эти команды в моем cygwin:

bison -d step3.y
flex step3.fl
gcc lex.yy.c -lfl -o step3

Ранее я пытался использовать

gcc step3.tab.c lex.yy.c -lfl -o step3

, но это вызвало много ошибок «Множественные определения« указанной функции »»поэтому я удалил это, и теперь он компилируется без ошибок.

В любом случае, при выполнении этих 3 команд я не получаю вывод.Даже не принт.

В моем файле step3.fl есть следующая опция:

%option noyywrap

Почему моя функция main () не работает?Как я могу заставить его работать?

1 Ответ

0 голосов
/ 11 ноября 2018

Причина, по которой ваш main не работает при компиляции с использованием gcc lex.yy.c -lfl -o step3, довольно проста: вы вообще не компилируете код, сгенерированный yacc. Так что не только ваш main не является частью окончательного исполняемого файла, ни ваш код синтаксического анализатора не является. Созданный исполняемый файл содержит только ваш лексер.

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

...