I have created a mini compiler for c language which test an exemple of code entred in file . Each time i execute the program , it show me a "Syntaxe Error in line 1" and i didn't understand the source of error .
This is the flex file :
%{
#include <stdlib.h>
#include <stdio.h>
#include "bison.tab.h"
extern YYSTYPE yylval;
%}
lettre [a-zA-Z]
chaine [a-zA-Z]+
chiffre [0-9]
id ([a-zA-Z]|'_')('_'|[a-zA-Z]|[0-9])*
nb {chiffre}{chiffre}*
fmain "main"
define "#define"
lire "scanf"
ecrire "printf"
tantque "while"
si "if"
sinon "else"
affect \=
plus \+
moins \-
mult \*
divi \/
virg \,
pointvirg \;
parouv \(
parfer \)
inf \<
infegal \<=
egal \==
diff \!=
sup \>
supegal \>=
accouv \{
accfer \}
%%
{fmain} { return(fmain); }
{define} { return(define); }
{lire} { return(lire); }
{ecrire} { return(ecrire); }
{si} { return(si); }
{sinon} { return(sinon); }
{tantque} {return(tantque);}
<<EOF>> { return fdf; }
{affect} { return(affect); }
{plus} { return(plus); }
{moins} { return(moins); }
{mult} { return(mult); }
{divi} { return(divi); }
{virg} { return(virg); }
{pointvirg} { return(pointvirg); }
{parouv} { return(parouv); }
{parfer} { return(parfer); }
{inf} { return(inf); }
{infegal} { return(infegal); }
{egal} { return(egal); }
{diff} { return(diff); }
{sup} { return(sup); }
{supegal} { return(supergal); }
{accouv} { return(accouv); }
{accfer} { return(accfer); }
{nb} { yylval = atoi(yytext);return (ent); }
{chaine} { return(chaine); }
{id} { return(ident); }
%%
This is the bison file :
%{
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define YYSTYPE int
extern FILE* yyin;
int yywrap(void);
extern int yylineno;
%}
%token chaine
%token ident
%token ent
%token fmain
%token define
%token si
%token sinon
%token tantque
%token lire
%token ecrire
%token affect
%token supergal
%token virg
%token pointvirg
%token parouv
%token parfer
%token inf
%token infegal
%token egal
%token diff
%token sup
%token accouv
%token accfer
%token fdf
%left plus
%left moins
%left mult
%left divi
%start FICHIER
%%
FICHIER : PROGRAMME fdf
;
PROGRAMME : DECL_CONST PROGRAMME2
|DECL_VAR PROG|PROG
;
PROGRAMME2 : DECL_VAR|PROG
;
DECL_CONST : define ident ent DECL_CONST2
;
DECL_CONST2 :
;
DECL_VAR : ent ident DECL_VAR2
;
DECL_VAR2 : SUITE_VAR pointvirg DECL_VAR3
|pointvirg DECL_VAR
;
DECL_VAR3 : DECL_VAR
|
;
SUITE_VAR : virg ident SUITE_VAR2
;
SUITE_VAR2 : SUITE_VAR
|
;
PROG : fmain parouv parfer BLOC
;
BLOC : accouv BLOC2
;
BLOC2 : AUTRES_INST accfer
;
AUTRES_INST : INSTRUCTION AUTRES_INST2
;
AUTRES_INST2 : AUTRES_INST
|
;
INSTRUCTION : CONDITIONNELLE
|ITERATION
|AFFECTATION
|LECTURE
|ECRITURE
;
CONDITIONNELLE : si parouv EXP parfer BLOC SUITE_COND
;
SUITE_COND : |
sinon BLOC
;
ITERATION : tantque parouv EXP parfer BLOC
;
AFFECTATION : ident affect EXP pointvirg
;
LECTURE : lire parouv ident parfer pointvirg
;
ECRITURE : ecrire parouv ECRITURE2
;
ECRITURE2 : parfer pointvirg
|EXP_OU_CH ECRITURE3
;
ECRITURE3 : AUTRES_ECRI parfer pointvirg
|parfer pointvirg
;
AUTRES_ECRI : virg EXP_OU_CH AUTRES_ECRI2
;
AUTRES_ECRI2 : AUTRES_ECRI
|
;
EXP_OU_CH : EXP
|chaine
;
EXP : TERME EXP2
;
EXP2 : OP_BIN EXP
|OP_REL EXP|
;
TERME : ent
|ident
|parouv EXP parfer
|moins TERME
;
OP_BIN : plus
|moins
|mult
|divi
;
OP_REL : inf
|infegal
|diff
|supergal
|sup
;
%%
/*int yyerror(char *s)
{
printf ("%s \n",s);
return 1;
}*/
int yywrap()
{
return 1;
}
yyerror(char *s)
{
extern int yylineno;
extern char yytext[];
fprintf(stderr, "%s in line %d near <%s>\n", s, yylineno, (char*)yytext);
exit(-1);
}
void main(int argc, char* argv[]) {
printf("**********Ouverture de fichier %s : **************\n",argv[1]);
yyin=fopen("Test.txt","r");
if (yyin>0) printf("fichier ouvert correctement\n");
else printf("ouverture de fichier echoué\n");
if (yyparse()==0 ) printf("Analyse terminé avec succés\nvotre syntaxe est conforme");
else { yyerror("Analyse terminé avec succés\nvotre syntaxe est erroné");
}
}