如何实现具有优先级和关联性的中缀计算器

我正在测试使用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

回到顶部