我正在尝试使用flex和bison生成器制作一个非常简单的计算器。它仅适用于整数。我正确编译了lexer文件,没有错误;但是当我编译解析器文件时,它显示了一些警告:
- 警告:1个非终结符在语法上无用
- 警告:2条规则在语法上无用
- 21.1-4:警告:语法中无终止符:行
- 21.9-1:警告:规则在语法中无用:行:NWL
- 22.9-55:警告:1个非终结符在语法上无用:Exp NWL
显示这些警告后,将生成输出文件。我用gcc编译了输出文件;它制作了一个[[.exe文件。当我运行。exe文件并尝试计算时,它向我显示此错误:
语法错误
我的代码:
lexer文件
%option noyywrap
%{
#define YYSTYPE double
#include <stdio.h>
#include "x.tab.h"
%}
DIG [0-9]
%%
{DIG}+ { yylval = atoi(yytext); return NUM; }
"+" { return PLS; }
"-" { return MNS; }
"*" { return MUL; }
"/" { return DIV; }
"\n" { return NWL; }
"(" { return LFT; }
")" { return RIT; }
%%
解析器文件
%{
#include <stdio.h>
#define YYSTYPE double
int yyerror (char const *s);
extern int yylex (void);
%}
%token PLS MNS
%token MUL DIV
%token NWL
%token NUM
%token LFT RIT
%left PLS MNS
%left MUL DIV
%%
Exp: NUM { $$ = $1; };
Exp: Exp PLS Exp { $$ = $1 + $3; };
Exp: Exp MNS Exp { $$ = $1 - $3; };
Exp: Exp MUL Exp { $$ = $1 * $3; };
Exp: Exp DIV Exp { $$ = $1 / $3; };
Exp: LFT Exp RIT { $$ = $2; };
Line: NWL;
Line: Exp NWL { printf("%f\n", $1); };
;
%%
int yyerror(char const *s) {
printf("%s\n", s);
}
int main(){
int ret = yyparse();
if (ret){
fprintf(stderr, "%d error found.\n",ret);
}
return 0;
}
我正在尝试使用flex和bison生成器制作一个非常简单的计算器。它仅适用于整数。我正确编译了lexer文件,没有错误;但是当我编译解析器文件时,它是...
Exp
,而不是Line
。要么先放置Line
规则,要么使用%start Line
声明。那应该使您处在程序可以处理第一行的位置,例如3 + 4
;-)