FLEX/BISON: 为什么我的规则没有得到重新调整?

发布于 2024-08-24 01:37:41 字数 1310 浏览 7 评论 0原文

我正在尝试用 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} 开头的行,错误消息翻译成英语是“无法识别的规则”。

I am trying to do a little exercice in FLEX and BISON.

Here is the code I wrote :

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 
lt; -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

Do you have any idea of what's wrong ?
Thanks

Edited:
The error message is
flex calc_pol.l: calc_pol.l:18: règle non reconnue
Line 18 is the line beginning with {reel}, and the error message translates to English as "unrecognized rule".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

空‖城人不在 2024-08-31 01:37:41

我不想破坏灵感闪现的乐趣,这就是为什么只提示:

1 2

和之间有什么区别

12

I don't want to break pleasure of flash of inspiration, that is why only hint: what the difference between

1 2

and

12
软甜啾 2024-08-31 01:37:41

问题来自于 entier 规则中 | 之间的空格

The problem came from the space between | in the entier rules

牵你的手,一向走下去 2024-08-31 01:37:41

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”这样的真实数字......什么你认为吗?

in calc_pol.l

{blancs} { ; } <------- !!
{reel}  { yylval = atof(yytext); return NOMBRE; }
\n      { return FIN; }
.       { return yytext[0]; }

I would be inclined to spot that you're missing an action for the '{blancs}'...

Edit: As more information came out of the OP the problem....is here....

entier  [+-]?[1-9][0-9]+
reel    {entier}('.'{entier})?

I would take out the last bit at the end of 'entier' as it looks to be a greedy match and hence not see the real number like '123.234'...what do you think?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文