2010-10-21 6 views
2

J'utilise Yacc et lex pour analyser un langage de type C, J'ai construit les structures de données en utilisant C++. tout fonctionne bien mais je ne suis pas capable de lire le fichier d'entrée en utilisant yyin dans main.cpp.Problème d'utilisation de yyin avec le fichier yacc

le code suivant est: S'il vous plaît, aidez-moi!

#include "parse_tree.h" 
#include<iostream> 
#include<cstdlib> 
#include<stdio.h> 
#include"y.tab.h" 

extern "C" FILE *yyin; 
FILE *fp; 

using namespace std; 

int main() { 



system("clear"); 

yyin=fopen("input_file","r+"); 
if(yyin==NULL) 
{ 
    cout<<"\n Error ! \n"; 
} 
do{ 
    cout<<"am parsing !"; 
     yyparse(); 

}while(!feof(yyin)); 
    return 0; 


fp=fopen("outfile","w"); 

yyparse(); 
} 


int yywrap() 
{ 

return 1; 

} 
+0

Quelle est l'erreur que vous voyez? – Rudi

Répondre

3

Tout d'abord, je ne comprends pas

extern "C" FILE *yyin; 

quand vous pouvez simplement écrire

extern FILE *yyin; 

de toute façon pourquoi vous ouvrez le fichier d'entrée pour la mise à jour (le paramètre mode '+') Si vous n'apportez aucune modification au fichier, alors inutile. Juste "r" est suffisant. La même chose avec la deuxième déclaration

fp=fopen("outfile","w"); 

si inutile ne pas ouvrir le fichier en mode écriture

Aussi, vous devriez probablement ajouter une instruction else à votre code .. sans que votre vérification d'erreur devient inutile ...

yyin=fopen("input_file","r+"); 
if(yyin==NULL) 
{ 
    cout<<"\n Error ! \n"; 
} 
else 
{ 
    cout<<"am parsing !"; 
    yyparse(); 
} 

vous reviennent aussi de la fonction

return 0; 

Encore une fois

}while(!feof(yyin)); 

est inutile si vous avez écrit récursivement votre grammaire. Cette déclaration est seulement nécessaire lorsque votre grammaire peut analyser une seule déclaration à la fois.