2010-03-09 109 views
2

我想在FLEX和BISON中做一点练习。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

​​

你知道什么是错吗? 感谢

编辑: 的错误消息是
flex calc_pol.l: calc_pol.l:18: règle non reconnue
第18行是{reel}开头的行,和错误信息翻译成英文为“无法识别的规则”。

+0

症状?...... – 2010-03-09 16:07:12

+0

要回答这个问题,我不知道什么是错的。你有任何实际证据表明有什么问题吗?如诊断输出,还是来自calc_pol的测试结果? – 2010-03-09 16:10:21

+0

'flex calc_pol.l':calc_pol.l:18:règlenon reconnue – Natim 2010-03-09 16:16:51

回答

2

问题之间的区别从太空来到|之间在entier规则

0

calc_pol.l

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

我会倾向于发现,你错过了 '{}白朗' 行动......

编辑:随着越来越多信息就出来了OP的问题....这里....

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

我会拿出最后一点在“entier”一结束它看起来是一个贪婪的比赛,因此看不到像'123.234'这样的真实数字......你怎么看?

+0

只是为了通知flex,如果是空白,我们不想做任何事情。 问题来自{reel}行。 – Natim 2010-03-09 16:11:22

+0

0也是一个整数。我只是不想要一些像0000这样的整数,但是这条规则对我有好处。无论如何,它不会改变错误。 – Natim 2010-03-09 17:58:59

+0

@Natim:('。'{entier})?意味着零或1,所以它应该接受一个整数....测试用例将是-23,23,23.45,-123.34,123.34 .... – t0mm13b 2010-03-09 18:10:02

6

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

1 2 

12 
+0

1和2是两个操作数,然后12只有一个。我不明白你的观点。 – Natim 2010-03-09 16:13:00

+2

+1,因为这应该是答案的答案,而不是他自己的答案:) – chucknelson 2010-03-29 01:32:03

相关问题