【发布时间】: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