FLEX/BISON: ;为什么我的规则没有重新制定?
我正试着在FLEX和BISON中做一些练习 以下是我编写的代码: calc_pol.yFLEX/BISON: ;为什么我的规则没有重新制定?,bison,calculator,flex-lexer,Bison,Calculator,Flex Lexer,我正试着在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 '+'
%{
#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;
%%
%{
#定义YYSTYPE双精度
#包括“计算油表h”
#包括
#包括
%}
%起跑线
%标记名
%代币鳍
%%
行: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);}
|名义上;
%%
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]; }
%%
{blancs} { ; } <------- !!
{reel} { yylval = atof(yytext); return NOMBRE; }
\n { return FIN; }
. { return yytext[0]; }
%{
#包括“计算油表h”
#包括
#包括
外部的YYSTYPE yylval;
%}
布兰克斯[\t]+
奇弗尔[0-9]
整个[+-]?[1-9][0-9]*|0
卷盘{entier}('.{entier})?
%%
{blancs}
{reel}{yylval=atof(yytext);返回NOMBRE;}
\n{返回FIN;}
. {返回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
all:calc_pol.tab.c lex.yy.c
gcc-o计算油$<-ly-lfl-lm
计算油表c:计算油
野牛-d calc_pol.y
法律yy.c:计算油料
弹性计算书
你知道怎么了吗?
谢谢
编辑:
错误消息是flex-calc_-pol.l:calc_-pol.l:18:règle不重新连接
第18行是以
{reel}
开头的行,错误消息翻译成英语为“未识别的规则”。在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]; }
%%
{blancs} { ; } <------- !!
{reel} { yylval = atof(yytext); return NOMBRE; }
\n { return FIN; }
. { return yytext[0]; }
{blancs}{;}我不想破坏灵感闪现的快感,这就是为什么只有提示:两者之间有什么区别
1 2
及
问题来自于
|
规则中
之间的空格。要回答这个问题,不,我不知道出了什么问题。你有什么实际的证据表明出了什么问题吗?例如诊断输出,或来自calc_pol?flex calc_pol.l的测试结果
:calc_pol.l:18:règle non Reconneue哪一行是第18行?在下面的注释中,您将其标识为{reel}{yylval=atof(yytext);返回NOMBRE;}
;对吗?另外,谷歌告诉我,错误消息被翻译成“Unrecognedrule”。这只是为了提醒flex,如果为空,我们不想做任何事情。问题来自{reel}行。0也是一个整数。我只是不想要像0000这样的整数,但这个规则对我很好。无论如何,它不会更改错误。@Natim:the('.{entier})?表示零或1,所以它应该接受一个整数…测试用例应该是-23,23,23.45,-123.34,123.34…在。是错的,你是对的。我这样更改了reel{entier}('.[0-9]+)?
1和2是两个操作数,然后12只是一个。我不明白你的意思。+1因为这应该是答案的功劳,而不是他自己的答案:)