Ошибка при вызове yyin и yyparse из main.c

#c #linker #yacc #lex

#c #компоновщик #yacc #лексический

Вопрос:

привет, я получаю следующую ошибку

 main.c: undefined reference to yyin
main.c: undefined reference to yyparse
  

это то, что я делаю
у меня есть файл lex
a.l
файл yacc
b.y

main.c является :

 #include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
extern int  yyparse();
extern FILE *yyin;
FILE *outFile_p;
main(int argc,char *argv[])
{
 if(argc<3)
  {
   printf("Please specify the input file amp; output filen");
   exit(0);
  }
 FILE *fp=fopen(argv[1],"r");
 if(!fp)
 {
  printf("couldn't open file for readingn");
  exit(0);
 }
  outFile_p=fopen(argv[2],"w");
  if(!outFile_p)
  {
   printf("couldn't open temp for writtingn");
   exit(0);
  }
  yyin=fp;
  yyparse();
 fclose(fp);
 fclose(outFile_p);
}
  

перед этим я должен связать:

x.h
и x.c.

Я пишу следующие команды на терминале :

 lex a.l  
yacc -v -d b.y   
gcc -o x.o -c x.c    
gcc -o main.o -c main.c     
gcc -o myexecutable main.o x.o    
  

вот когда я получаю эту ошибку. что я делаю не так?

Комментарии:

1. Я не уверен, что это хорошая идея #include <iostream.h> в программе на C…

2. Достаточно вызвать, gcc -c foo.c чтобы получить объектный файл с именем foo.o .

Ответ №1:

Кажется, вы игнорируете .c файлы, сгенерированные lex и yacc. Они часто вызываются y.tab.c и lex.yy.c , но вам лучше проверить это самостоятельно. Тогда последовательность вызовов должна каким-то образом напоминать следующую:

 lex a.l  
yacc -v -d b.y
gcc -c y.tab.c
gcc -c lex.yy.c
gcc -c x.c    
gcc -c main.c     
gcc -o myexecutable *.o
  

Ответ №2:

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

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