Analyse Syntaxique Fichier YACC
Salut tout le monde,je chercher depuis des heures à résoudre un problème qui me pourris mon compilateur en Lex/Bison pour Pascal.
J'ai développé un fichier Yacc pour traduire la grammaire qu'on m'a donné,voici le fichier .y :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
| %{
#include "declarations.h"
#include "unistd.h" /* pour le unlink */
#include "errno.h" /* pour les perror */
#include "string.h"
%}
%start programmes
%token PROGRAMME
%token DEBUT
%token FIN
%token DECLARATION
%token AFFECTATION
%token SI
%token ALORS
%token SINON
%token TANT_QUE
%token FAIRE
%token NON
%token FONCTION
%token PROCEDURE
%token OPERATION
%token COMPARAISON
%token AJOUT
%token <chaine> IDENT
%token <chaine> NBRE
%token <chaine> TYPE
%union
{
char chaine[256];
symbole * liste;
}
%%
programmes : PROGRAMME IDENT ';' déclaration instruction_composée'.'
;
déclaration : déclaration_var déclaration_sous_programmes
;
déclaration_var : déclaration_var DECLARATION liste_identificateurs ':' TYPE ';'
|
;
liste_identificateurs : IDENT
| liste_identificateurs ',' IDENT
;
déclarations_sous_programmes : déclarations_sous_programmes déclarations_sous_programme ';'
|
;
déclarations_sous_programme :entete_sous_programme déclaration instruction_composée
;
entete_sous_programme : FONCTION IDENT arguments ':' TYPE ';'
| PROCEDURE IDENT arguments ';'
;
arguments :'('liste_paramètres')'
|
;
liste_paramètres: paramètre
| listes_paramètres ';' paramètre
;
paramètre : IDENT ':' TYPE
| DECLARATION IDENT ':' TYPE
;
instruction_composée : DEBUT instructions_optionnelles FIN
;
instructions_optionnelles : liste_instructions
|
;
liste_instructions : instruction
| liste_instructions ';' instruction
;
instruction : variable AFFECTATION expression
| appel_de_procédure
| instruction_composée
| SI expression ALORS instruction SINON instruction
| TANT_QUE expression FAIRE instruction
;
variable : IDENT
;
appel_de_procédure : IDENT
| IDENT'('liste_expressions')'
;
liste_expressions : expression
| liste_expressions ',' expression
;
expression: expression_simple
| expression_simple COMPARAISON expression_simple
;
expression_simple : terme
| signe terme
| expression_simple AJOUT terme
;
terme : facteur
| terme OPERATION facteur
;
facteur : IDENT
| IDENT'('liste_expressions')''
| NBRE
|'('expression')'
| NON facteur
;
signe : '+'
| '-'
;
%%
int main (int argc, char * argv[])
{
symbole * pt_sym, * p;
FILE * fic_source;
char * fic_dest, * table_quad = "table_quad", * table_symb = "table_symb";
int i, l;
/* Vérification du nombre de paramètres */
if (--argc!=1 || !strcmp(argv[1], "-h"))
{
fprintf (stderr, "Usage: %s <fichier>\n", argv[0]);
exit (1);
}
else
{
fic_source = fopen (argv[1], "r");
if (!fic_source)
{
perror(argv[1]);
fprintf (stderr, "%s: Fichier \"%s\" illisible !\n", argv[0], argv[1]);
exit (2);
}
yyin = fic_source;
} |
-Problème,lorsque j'essaye de compiler j'ai un line 39 : invalid input la ligne 39 correspond à :
Code:
1 2 3
|
programmes : PROGRAMME IDENT ';' déclaration instruction_composée'.'
; |
-J'ai revérifié mon code plusieurs fois mas je n'arrive pas à desceller d'erreurs,votre aide serait extrêmement précieuse.
-Si vous avez besoin de la grammaire do'rigine faites moi signe je la posterai.
Merci d'avance et svp je suis désespéré je n'arrive plus à avancer.