문제

나는 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'와 같은 실제 숫자는 보이지 않습니다 ... 당신은 어떻게 생각하십니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top