FLEX / BISON: Warum ist meine Regel nicht erkannt?
-
18-09-2019 - |
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“.
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?