如何实现具有优先级和关联性的中缀计算器
我正在测试使用bison flex编写中缀计算器的示例。我发现除了方括号“()”之外,一切都是正确的。我发现当我用括号输入一个计算时,计算结果是不正确的。下面是文件的“缀calc.y”如何实现具有优先级和关联性的中缀计算器
/* bison grammar file for infix notation calculator */ %{
#define YYSTYPE double
#include <math.h>
#include <stdio.h>
int yyerror(const char *s);
int yylex(void);
%}
%token NUM
%left '-' '+'
%left '*' '/'
%left NEG
%right '^'
%% /* Grammer rules and actions follow */
input: /* empty */
| input line
;
line: '\n'
| exp '\n' { printf("\t%.10g\n", $1); }
;
exp: NUM { $$ = $1; }
| exp '+' exp { $$ = $1 + $3; }
| exp '-' exp { $$ = $1 - $3; }
| exp '*' exp { $$ = $1 * $3; }
| exp '/' exp { $$ = $1/$3; }
| '-' exp %prec NEG { $$ = -$2; }
| exp '^' exp { $$ = pow($1, $3); }
| '(' exp ')' { $$ = $2; }
;
%%
/* Additional C code */
int main() { return yyparse(); }
int yyerror(const char* s)
{
printf("%s\n", s);
return 0;
}
的代码,这里是文件的“缀calc.lex”代码
/* lex file for infix notation calculator */ %option noyywrap
%{
#define YYSTYPE double /* type for bison's var: yylval */
#include <stdlib.h> /* for atof(const char*) */
#include "infix-calc.tab.h"
%}
digits [0-9]
rn (0|[1-9]+{digits}*)\.?{digits}*
op [+*^/\-]
ws [ \t]+
%%
{rn} yylval = atof(yytext); return NUM;
{op} |
\n return *yytext;
{ws} /* eats up white spaces */
%%
的问题是,当我输入,说“2 *(3 + 4)”,我应该收到输出“14”。但输入是“()10”。看来括号在这种情况下不起作用。代码有什么问题? 非常感谢你帮助我!
回答:
看起来你必须声明(
和)
作为令牌才能工作。
添加最终%%
之前,以下两行的文件法:
"(" return LEFT; ")" return RIGHT;
然后加入
%token LEFT RIGHT
到缀calc.y的顶部,并更换
| '(' exp ')' { $$ = $2; }
与
| LEFT exp RIGHT { $$ = $2; }
以上是 如何实现具有优先级和关联性的中缀计算器 的全部内容, 来源链接: utcz.com/qa/266291.html