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
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 isflex 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我不想破坏灵感闪现的乐趣,这就是为什么只提示:
和之间有什么区别
I don't want to break pleasure of flash of inspiration, that is why only hint: what the difference between
and
问题来自于
entier
规则中|
之间的空格The problem came from the space between
|
in theentier
rules在 calc_pol.l 中,
我倾向于发现您缺少“{blancs}”的操作...
编辑: 随着更多信息来自OP问题......就在这里......
我会取出“entier”末尾的最后一位,因为它看起来是一个贪婪的匹配,因此看不到像“123.234”这样的真实数字......什么你认为吗?
in calc_pol.l
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....
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?