Shift减少冲突,使用编译器的金融计算器

时间:2015-09-16 03:46:42

标签: c++ bison shift-reduce-conflict

每当我添加'(' term ')' { $$=$2; }时,我都会减少冲突 我尝试做的操作是:(5) + (5)
(5.5) + (5)
((5.5) + (5)) - (5)
((5.5) / (5.5)) * (5)等等

我对转移减少解析有点困惑,我们的教授只教我们如何在示例语法中转移reduce解析,而不是如何在cpp上应用它。

我正在使用野牛。

%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int yylex();
#define YYERROR_VERBOSE
void yyerror(const char *msg){
printf("ERROR(PARSER): %s\n", msg);
}
double vars[26];
%}
%union{
double dvalue;
int varindex;
}
%token <dvalue> NUMBER
%token <varindex> NAME
%type <dvalue> expression
%type <dvalue> term
%type <dvalue> varornum
%%
statementlist : statement '\n'
| statement '\n' statementlist
;
statement : NAME '=' expression { vars[$1] = $1;}
| expression { printf("ANS: %f\n", $1); }
;
expression: '(' expression ')' { $$ = $2;}
| expression '+' term { $$ = $1 + $3;}
| expression '-' term { $$ = $1 - $3;}
| term { $$ = $1; }
;
term : '(' term ')' { $$ = $2;}
| term '*' varornum { $$ = $1 * $3;}
| term '/' varornum {
if ($3==0) {
printf("ERROR: Divide %f by zero\n", $1);
} else {
$$ = $1 / $3;
}
}
| varornum { $$ = $1; }
;
varornum : NUMBER { $$ = $1; }
| NAME { $$ = vars[$1];}
;
%%
main(){
yyparse();
}

1 个答案:

答案 0 :(得分:1)

你的语法中已经有'(' expr ')' { $$=$2; }。添加'(' term ')' { $$=$2; }会与此规则产生冲突。你只需要其中一个。是expr一个term还是termexpr