我想在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}
开头的行,错误消息将英语翻译为“无法识别的规则”。
答案 0 :(得分:6)
我不想打破闪光灵感的快感,这就是为什么只提示:有什么区别
1 2
和
12
答案 1 :(得分:2)
问题来自|
规则
entier
之间的空格
答案 2 :(得分:0)
{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'这样的真实数字...你觉得怎么样?