У меня есть грамматика для арифметического выражения, которая решает количество выражений (по одному на строку) в текстовом файле. При компиляции YACC я получаю сообщение смену 2 смены конфликтов. Но мои расчеты правильные. Если синтаксический анализатор дает правильный результат, как он разрешает конфликт сдвига/уменьшения. И в моем случае есть какой-либо способ решить эту проблему в грамматике YACC.Как парсер решает конфликт сдвига/уменьшения?
YACC GRAMMAR
Calc : Expr {printf(" = %d\n",$1);}
| Calc Expr {printf(" = %d\n",$2);}
| error {yyerror("\nBad Expression\n ");}
;
Expr : Term { $$ = $1; }
| Expr '+' Term { $$ = $1 + $3; }
| Expr '-' Term { $$ = $1 - $3; }
;
Term : Fact { $$ = $1; }
| Term '*' Fact { $$ = $1 * $3; }
| Term '/' Fact { if($3==0){
yyerror("Divide by Zero Encountered.");
break;}
else
$$ = $1/$3;
}
;
Fact : Prim { $$ = $1; }
| '-' Prim { $$ = -$2; }
;
Prim : '(' Expr ')' { $$ = $2; }
| Id { $$ = $1; }
;
Id :NUM { $$ = yylval; }
;
Какие изменения я должен сделать, чтобы удалить такие конфликты в моей грамматике?
Я использовал эту вещь, это устраняет конфликт сдвига/уменьшения, но у меня есть текстовый файл, который будет иметь новое выражение с новой строкой, в которой эта вещь будет рассматривать весь текст как одно уравнение, и пользователь может или не может использовать() в выражении. –
@nikul: да, вы бы лучше оставили грамматику выражения, как было, и изменили свой лексический сканер, чтобы вернуть токены новой строки, чтобы вы могли использовать версию с разделителями новой строки 'Calc' – rici
. Вы также можете взглянуть на http://stackoverflow.com/a/42093276/1566221, но не копируйте код: в коде OP есть много проблем (иначе он бы не спросил :)), и мой ответ не касается проблемы приоритезации операторов. Но он действительно делает новые строки правильно. – rici