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); 返回名词;}
\n { 返回 FIN; }
. { 返回 yytext[0]; }

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

编辑:随着更多信息来自 OP 问题....就在这里....

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

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

于 2010-03-09T16:09:45.807 回答