ГИБКИЙ /ЗУБРОВЫЙ :Почему мое правило не регонизировано?
-
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'...что вы думаете?