ГИБКИЙ /ЗУБРОВЫЙ :Почему мое правило не регонизировано?

StackOverflow https://stackoverflow.com/questions/2410431

  •  18-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь сделать небольшое упражнение по ФЛЕКСУ и БИЗОНУ.

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

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;
%%

вычисление_пол.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}, и сообщение об ошибке переводится на английский как "нераспознанное правило".

Это было полезно?

Решение 2

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

Другие советы

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

1 2

и

12

в вычисление_пол.l

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top