【问题标题】:FLEX/BISON : Why my rule is not regonized?FLEX/BISON:为什么我的规则无法识别?
【发布时间】:2011-01-25 12:13:26
【问题描述】:

我正在尝试在 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} 开头的行,错误信息翻译成英文为“unrecognized rule”。

【问题讨论】:

  • 要回答这个问题,不,我不知道出了什么问题。您是否有任何实际证据表明出了问题?例如诊断输出,或来自 calc_pol 的测试结果?
  • flex calc_pol.l: calc_pol.l:18: règle non reconnue
  • 第 18 行是哪一行?在下面的评论中,您将其标识为{reel} { yylval = atof(yytext); return NOMBRE; };那是对的吗?此外,Google 告诉我错误消息翻译为“无法识别的规则”。

标签: bison calculator flex-lexer


【解决方案1】:

calc_pol.l

中 {布兰克斯} { ; }

我会倾向于发现您缺少对“{blancs}”的操作...

编辑:随着更多信息从 OP 中传出,问题....就在这里....

进入 [+-]?[1-9][0-9]+ 卷轴 {entier}('.'{entier})?

我会在 'entier' 的末尾取出最后一位,因为它看起来是一个贪婪的匹配,因此看不到像 '123.234' 这样的真实数字......你怎么看?

【讨论】:

  • 只是要注意flex,在空白的情况下,我们什么都不想做。问题来自 {reel} 行。
  • 0 也是一个整数。我只是不想要像 0000 这样的整数,但这条规则对我来说很合适。无论如何,它不会改变错误。
  • @Natim: ('.'{entier})?表示 0 或 1,所以它应该接受一个整数......测试用例将是 -23、23、23.45、-123.34、123.34......
  • 在 .是错的,你是对的。我改成这样reel {entier}('.'[0-9]+)?
【解决方案2】:

我不想打破灵感一闪而过的快感,所以只提示:两者有什么区别

1 2

12

【讨论】:

  • 1 和 2 是两个操作数,那么 12 只是一个。我不明白你的意思。
  • +1 因为这应该归功于答案,而不是他自己的答案:)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多