2

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

メイクファイル

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}であり、エラー メッセージは「認識されないルール」として英語に変換されます。

4

3 に答える 3

6

ひらめきの喜びを壊したくないので、ヒントのみ:

1 2

12
于 2010-03-09T16:10:40.457 に答える
2

|問題は、entierルールの間のスペースから発生しました

于 2010-03-10T08:26:00.727 に答える
0

calc_pol.l

{空白} {; } <------ !!
{リール} { yylval = atof(yytext); NOMBRE を返します。}
\n { FIN を返します。}
. { yytext[0] を返します。}

「{blancs}」に対するアクションが欠落していることに気付きたいと思います...

編集: OPからより多くの情報が出てきたので、問題は....ここにあります....

全体 [+-]?[1-9][0-9]+
リール {entier}('.'{entier})?

「entier」の最後にある最後のビットを取り出します。貪欲な一致のように見え、「123.234」のような実数が表示されないためです...どう思いますか?

于 2010-03-09T16:09:45.807 に答える