[YACC] Problème de syntaxe

Problème de syntaxe [YACC] - C - Programmation

Marsh Posté le 06-06-2004 à 21:26:45    

Bonjour
J'ai un fichier .y qui a pour but de traduire un code en pseudo-langage en  anglais. Il se compile correctement, mais lorsque je l'execute, j'ai une syntax error à chaque ligne du fichier contenant mon code. Je ne comprend pas pourquoi, et depuis 3 heures que je suis dessus je sature. Qqun à une idée ?
 
voila le fichier test.y:

Code :
  1. %{
  2. #include <ctype.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. %}
  6. %token PROGRAMME
  7. %token DEBUT
  8. %token SI
  9. %token CODE
  10. %token LIGNE_VIDE
  11. %token FIN
  12. %%
  13. input : input line
  14.        | /*vide*/
  15. ;
  16. line : '\n'
  17. |      expr'\n'
  18.       ;
  19. expr : DEBUT {printf("BEGIN\n" );}
  20.       | FIN {printf("END\n" );}
  21.       | SI {printf("IF THEN\n" );}
  22. | CODE /*empty*/
  23. | PROGRAMME {printf("PROGRAM\n" );}
  24. | LIGNE_VIDE /*rien*/
  25. ;
  26. %%
  27. FILE *yyin;
  28. int yylex(){
  29. int i=0;
  30. int c;
  31. char l[50]="";
  32. fgets(l, 50, yyin);
  33. if (l!=NULL){
  34.  while ((l[i]!='\n') && (i<50)){
  35.   i++;
  36.  }
  37.  if (l[i]=='\n')
  38.  {
  39.   l[i]='\0';
  40.  }
  41.  if (strcmp(l, "PROGRAMME" )==0){
  42.   return PROGRAMME;
  43.  }
  44.  else if (strcmp(l, "DEBUT" )==0)
  45.  { return DEBUT;}
  46.  else if (strcmp(l, "FIN" )==0)
  47.  { return FIN;}
  48.  else if (strncmp(l, "SI", 2)==0)
  49.  { return SI;}
  50.  else if (l[0]=='\0'){
  51.   return LIGNE_VIDE;
  52.  }
  53.  else{
  54.   printf("%s\n",l);
  55.   return CODE;
  56.  }
  57. }
  58. }
  59. int yyerror(char *s)
  60. {
  61. printf("erreur: %s\n",s);
  62. }
  63. main(){
  64. yyin=fopen("gram", "r" );
  65. while(!feof(yyin)){
  66.  yyparse();
  67. }
  68. fclose(yyin);
  69. }


 
et mon fichier contenant le langage:

Code :
  1. PROGRAMME
  2. DEBUT
  3. SI (a=b) ALORS
  4. DEBUT
  5. "pouet"
  6. FIN
  7. FIN


Message édité par Bleuarff le 06-06-2004 à 21:27:12
Reply

Marsh Posté le 06-06-2004 à 21:26:45   

Reply

Marsh Posté le 07-06-2004 à 11:54:04    

nan, ça vous inspire pas ?

Reply

Marsh Posté le 07-06-2004 à 12:11:15    

Par hasard, tu ne compilerais pas sous Linux et utiliserais un fichier de test fait sous windows avec plein de \n\r à la fin de chaque ligne ?
 
Et ça marche ça  [:w3c compliant] :

Code :
  1. char l[50]="";


 
Quelques remarques :
- pourquoi tu n'utilises pas lex pour lexer ton fichier d'entrée, c'est plus simple et plus sûr (si tu passe un fichier ou une ligne fait plus de 50 caractères sa plante dans ton programme...)
- A quoi ça te serts de savoir qu'il y a une LIGNE_VIDE dans le parseur ?

Reply

Marsh Posté le 08-06-2004 à 11:50:45    

bah ouais ça marche, le pb venait de  

Code :
  1. line : '\n'
  2.    |      expr'\n'
  3.    ;


 
j'ai mis expr tout seul et ça marche bien.
 
J'ai pas utilisé lex car pas le temps d'apprendre à l'utiliser, j'ai rien compris à ce que je faisais, la soutenance de cet aprem' va être comique :/.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed