Flex/Bison : 왜 내 규칙이 재조화되지 않습니까?
-
18-09-2019 - |
문제
나는 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}
, 및 오류 메시지는 영어로 "인식되지 않은 규칙"으로 변환됩니다.
해결책 2
문제는 사이의 공간에서 나왔습니다 |
에서 entier
규칙
다른 팁
나는 영감의 섬광의 즐거움을 깨고 싶지 않기 때문에 힌트 만
1 2
그리고
12
안에 calc_pol.l
{blancs} { ; } <------- !! {reel} { yylval = atof(yytext); return NOMBRE; } \n { return FIN; } . { return yytext[0]; }
나는 당신이 '{blancs}'에 대한 조치를 놓친 것을 발견하려고합니다.
편집하다: 더 많은 정보가 OP에서 나왔을 때 문제가 있습니다 .... 여기 있습니다 ....
entier [+-]?[1-9][0-9]+ reel {entier}('.'{entier})?
나는 욕심 많은 경기 인 것처럼 보이기 때문에 'Entier'의 끝에서 마지막 비트를 꺼낼 것입니다. 따라서 '123.234'와 같은 실제 숫자는 보이지 않습니다 ... 당신은 어떻게 생각하십니까?
제휴하지 않습니다 StackOverflow