FLEX / BISON: Почему мое правило не повторяется? - PullRequest
2 голосов
/ 09 марта 2010

Я пытаюсь сделать небольшое упражнение в FLEX и BISON.

Вот код, который я написал:

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

Ты хоть представляешь, что не так? Спасибо

Отредактировано: Сообщение об ошибке
flex calc_pol.l: calc_pol.l:18: règle non reconnue
Строка 18 - это строка, начинающаяся с {reel}, а сообщение об ошибке переводится на английский как «нераспознанное правило».

Ответы [ 3 ]

6 голосов
/ 09 марта 2010

Я не хочу нарушать удовольствие от вспышки вдохновения, а потому только намек: какая разница между

1 2

и

12
2 голосов
/ 10 марта 2010

Проблема возникла из промежутка между | в правилах entier

0 голосов
/ 09 марта 2010

in calc_pol.l

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

Я был бы склонен заметить, что вы пропускаете действие для '{blancs}' ...

Редактировать: Поскольку из ОП появилось больше информации, проблема ... здесь ...

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

Я бы выбрал последний бит в конце 'entier', поскольку он выглядит как жадное совпадение и, следовательно, не увидел бы действительного числа типа '123.234' ... как вы думаете?

...