2010-03-09 4 views
2

J'essaye de faire un petit exercice chez FLEX et BISON.FLEX/BISON: Pourquoi ma règle n'est pas reconisée?

Voici le code que j'ai écrit:

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 

Avez-vous une idée de ce qui ne va pas? Merci

Edité: Le message d'erreur est
flex calc_pol.l: calc_pol.l:18: règle non reconnue
ligne 18 est la ligne commençant par {reel}, et le message d'erreur se traduit à l'anglais comme « règle non reconnue ».

+0

Symptômes? ... –

+0

Pour répondre à la question, non je n'ai aucune idée de ce qui ne va pas. Avez-vous des preuves concrètes que quelque chose ne va pas? Telles que la sortie de diagnostic, ou les résultats de test de calc_pol? –

+0

'flex calc_pol.l': calc_pol.l: 18: règle non reconnue – Natim

Répondre

2

Le problème est venu de l'espace entre | dans les entier règles

0

dans calc_pol.l

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

Je serais enclin à repérer que vous manquez une action pour les '{}' ... blancs

Edit: Comme plus information est sorti de l'OP le problème .... est ici ....

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

Je voudrais retirer le dernier bit à la fin de 'entier' un s ça a l'air d'être un match gourmand et donc de ne pas voir le vrai numéro comme '123.234' ... qu'en penses-tu?

+0

Il est juste de remarquer que pour fléchir en cas de blanc, nous ne voulons rien faire. Le problème provient de la ligne {reel}. – Natim

+0

0 est également un nombre entier. Je ne veux pas d'un nombre entier comme 0000, mais cette règle me convient parfaitement. Quoi qu'il en soit, cela ne change pas l'erreur. – Natim

+0

@Natim: le ('.' {Entier})? signifie zéro ou 1, donc il devrait accepter un nombre entier .... les cas de test seraient -23, 23, 23.45, -123.34, 123.34 .... – t0mm13b

6

Je ne veux pas briser le plaisir de flash d'inspiration, c'est pourquoi seul indice: quelle est la différence entre

1 2 

et

12 
+0

1 et 2 sont deux opérandes alors 12 est seulement un. Je ne comprends pas votre point. – Natim

+2

+1 parce que cela aurait dû être le crédit de la réponse, pas sa propre réponse :) – chucknelson

Questions connexes