Frage

Ich versuche, ein wenig exercice in FLEX und BISON zu tun.

Hier ist der Code, den ich schrieb:

calc_pol.y

%{
#define YYSTYPE double
#include "calc_pol.tab.h"
#include <math.h>
#include <stdlib.h>
%}
%start line
%token NOMBRE
%token FIN
%%
line: exp '\n' { printf("\t%.2lf\n", $1); };
exp: exp exp '+' { $$ = $1 + $2 ;}
     | exp exp '-' { $$ = $1 - $2 ;}
     | exp exp '*' { $$ = $1 * $2 ;}
     | exp exp '/' { $$ = $1 / $2 ;}
     | exp exp '^' { $$ = pow($1, $2) ;}
     | NOMBRE;
%%

calc_pol.l

%{
    #include "calc_pol.tab.h"
    #include <stdlib.h>
    #include <stdio.h>
    extern YYSTYPE yylval;
%}

blancs  [ \t]+

chiffre [0-9]
entier  [+-]?[1-9][0-9]* | 0
reel    {entier}('.'{entier})?

%%

{blancs} 
{reel}  { yylval = atof(yytext); return NOMBRE; }
\n      { return FIN; }
.       { return yytext[0]; }
%%

Makefile

all: calc_pol.tab.c lex.yy.c
        gcc -o calc_pol $< -ly -lfl -lm

calc_pol.tab.c: calc_pol.y
        bison -d calc_pol.y

lex.yy.c: calc_pol.l
        flex calc_pol.l

Haben Sie eine Vorstellung davon, was falsch ist? Dank

Editiert: Die Fehlermeldung ist
flex calc_pol.l: calc_pol.l:18: règle non reconnue
Die Linie 18 ist die Linie mit {reel} beginnen, und der Fehlermeldung übersetzt in Englisch als „nicht anerkannte Regel“.

War es hilfreich?

Lösung 2

Das Problem kam aus dem Raum zwischen | in den entier Regeln

Andere Tipps

Ich will nicht Freude an dem Blitz der Inspiration brechen, das ist, warum nur Hinweis: was ist der Unterschied zwischen

1 2

und

12

in calc_pol.l

{blancs} { ; } <------- !!
{reel}  { yylval = atof(yytext); return NOMBRE; }
\n      { return FIN; }
.       { return yytext[0]; }

Ich würde geneigt sein, zu erkennen, dass Sie eine Aktion für den ‚{blancs}‘ fehlen ...

Edit: Da immer mehr Informationen aus dem OP das Problem kam .... ist hier ....

entier  [+-]?[1-9][0-9]+
reel    {entier}('.'{entier})?

Ich würde das letzte Bit am Ende des ‚entier‘ herausnehmen, da es ein gieriges Spiel zu sein, sieht und daher nicht die wirkliche Zahl wie ‚123,234‘ sieht ... was denken Sie?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top