Shift уменьшить конфликт, финансовый калькулятор с помощью компилятора

Всякий раз, когда я добавляю '(' term ')' { $$=$2; } Я получил сдвиг уменьшить конфликт
операция, которую я пытаюсь сделать: (5) + (5),
(5.5) + (5),
((5.5) + (5)) - (5),
((5.5) / (5.5)) * (5), так далее

Я немного озадачен анализом сдвига с уменьшением, наш преподаватель только учит нас, как разбирать смещение с уменьшением в примере грамматики, но не о том, как применять его в 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();
}

0

Решение

У тебя уже есть '(' expr ')' { $$=$2; } в вашей грамматике. Добавление '(' term ')' { $$=$2; } создает конфликт с этим правилом. Вам нужен только один из них. Является expr term или является term expr?

1

Другие решения


По вопросам рекламы [email protected]