执行flex bison程序时出现语法错误

时间:2016-12-14 18:30:19

标签: bison flex-lexer

我为c语言创建了一个迷你编译器,它测试了文件中的代码示例。 每次执行程序时,它都会在第1行和第34行显示"语法错误。我并不了解错误的来源。

这是flex文件:

%{
#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); }
%%

这是野牛档案:

%{
#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é");
}
}

0 个答案:

没有答案