FLEX/BISON: ;为什么我的规则没有重新制定?

FLEX/BISON: ;为什么我的规则没有重新制定?,bison,calculator,flex-lexer,Bison,Calculator,Flex Lexer,我正试着在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 '+'

我正试着在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;
%%
%{
#定义YYSTYPE双精度
#包括“计算油表h”
#包括
#包括
%}
%起跑线
%标记名
%代币鳍
%%
行: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);}
|名义上;
%%
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]; }
%%
{blancs} { ; } <------- !! {reel} { yylval = atof(yytext); return NOMBRE; } \n { return FIN; } . { return yytext[0]; }
%{
#包括“计算油表h”
#包括
#包括
外部的YYSTYPE yylval;
%}
布兰克斯[\t]+
奇弗尔[0-9]
整个[+-]?[1-9][0-9]*|0
卷盘{entier}('.{entier})?
%%
{blancs}
{reel}{yylval=atof(yytext);返回NOMBRE;}
\n{返回FIN;}
.       {返回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
all:calc_pol.tab.c lex.yy.c
gcc-o计算油$<-ly-lfl-lm
计算油表c:计算油
野牛-d calc_pol.y
法律yy.c:计算油料
弹性计算书
你知道怎么了吗? 谢谢

编辑: 错误消息是
flex-calc_-pol.l:calc_-pol.l:18:règle不重新连接


第18行是以
{reel}
开头的行,错误消息翻译成英语为“未识别的规则”。

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]; }
%%
{blancs} { ; } <------- !! {reel} { yylval = atof(yytext); return NOMBRE; } \n { return FIN; } . { return yytext[0]; }
{blancs}{;}我不想破坏灵感闪现的快感,这就是为什么只有提示:两者之间有什么区别

1 2


问题来自于
|
规则中
之间的空格。要回答这个问题,不,我不知道出了什么问题。你有什么实际的证据表明出了什么问题吗?例如诊断输出,或来自calc_pol?
flex calc_pol.l的测试结果
:calc_pol.l:18:règle non Reconneue哪一行是第18行?在下面的注释中,您将其标识为
{reel}{yylval=atof(yytext);返回NOMBRE;}
;对吗?另外,谷歌告诉我,错误消息被翻译成“Unrecognedrule”。这只是为了提醒flex,如果为空,我们不想做任何事情。问题来自{reel}行。0也是一个整数。我只是不想要像0000这样的整数,但这个规则对我很好。无论如何,它不会更改错误。@Natim:the('.{entier})?表示零或1,所以它应该接受一个整数…测试用例应该是-23,23,23.45,-123.34,123.34…在。是错的,你是对的。我这样更改了
reel{entier}('.[0-9]+)?
1和2是两个操作数,然后12只是一个。我不明白你的意思。+1因为这应该是答案的功劳,而不是他自己的答案:)