J'ai essayé les fichiers lex et yacc ci-dessous et il semble qu'il existe plusieurs définitions pour de nombreuses fonctions telles que yylex, yyrestart et bien d'autres. J'ai essayé plusieurs façons et les matériaux en ligne mais je n'ai pas pu le résoudre. Toute aide pourrait être appréciée.

Le fichier try1.l est comme ci-dessous,

%{
#include "y.tab.h"
int linenum=1;
int temp_int;
%}
%%

\n     {linenum++;}

[\t ]         /* skip spaces */;
\/\/[^\n]*    /* ignore comments */;

"+"     {return '+';}
"-"     {return '-';}
"*"     {return '*';}
"/"     {return '/';}
")"     {return ')';}
"("     {return '(';}

[0-9]+   {sscanf(yytext, "%d", &temp_int);
          yylval.int_val = temp_int;
          return INT;}

.  {printf("LEX: unknown input string found in line %d \n", linenum);
    abort();}
%%

int yywrap(void) {return 1;}

Try1.y comme ci-dessous,

/* Put new code here */

%{
#include <stdio.h>
#include <ctype.h>


extern int linenum;
%}


/* define all types of variables and terminals */  

%union{
  int int_val;
}

/* define the individual types of variables and terminals */

%token <int_val> INT   
%type <int_val> expr



/* assign priorities to operators in order to 
   avoid shift/reduce conflicts (grammar ambiguities) */

%left '+' '-'
%left '*' '/'
%left UMINUS


/* the start variable of your program */

%start program


/* The main Grammar with its actions */

%%

program : expr        {printf("Expr value = %d \n", $1);}
        | error       {printf("YACC: syntax error near line %d \n", linenum);
                       abort();}
        ;

expr :'('expr')'        {$$ = $2;}  
     | expr '+' expr    {$$ = $1 + $3;}
     | expr '-' expr    {$$ = $1 - $3;}
     | expr  '*' expr   {$$ = $1 * $3;}
     | expr '/' expr    {$$ = $1 / $3;}
     | '-' expr  %prec UMINUS  {$$ = -$2;}
     | INT              {$$ = $1;}
     ;
      

%%

/* link lex code */

#include "lex.yy.c"

/* insert additional code here */

int main(){
    return yyparse();
}

int yyerror(char *s) {fprintf(stderr, "%s \n",s);}

La sortie est comme ci-dessous,

enter image description here

3
monir zaman 31 oct. 2020 à 04:42

1 réponse

Meilleure réponse

Vous voyez ce problème parce que le code source de l'analyseur lexical est inclus deux fois.

Lorsque vous utilisez à la fois lex et yacc (ou flex et bison), le compilateur généré (la sortie yacc) est généralement #include la source de l'analyseur lexical généré.

Vous pouvez le voir dans votre try1.y et le code de sortie try1.tab.c :

/* link lex code */

#include "lex.yy.c"

/* insert additional code here */

Donc, soit supprimez cela manuellement du try1.tab.c, soit ne compilez pas le lex.yy.c avec le try1.tab.c.

Probablement juste:

$ flex try1.l
$ bison -d try1.y
$ gcc -g -Wall try1.tab.c -o try1.exe

Te fera avancer.

1
Kingsley 31 oct. 2020 à 02:01