Предупреждение: 2 сдвига / уменьшения конфликтов [-Wconflicts-sr] err - PullRequest
0 голосов
/ 06 июня 2018
%{
#include<stdio.h>
#include<stdlib.h>
int regs[30];
%}
%token NUMBER LETTER
%left  PLUS MINUS 
%left MULT DIV 
%%

prog: prog st | ; //when I remove this line the error goes
st : E {printf("ans %d", $1);}| LETTER '=' E {regs[$1] = $3; printf("variable contains %d",regs[$1]);}; 
E :  E PLUS E{$$ = $1 + $3;} //addition
| E MINUS E{$$ = $1 - $3 ;} //subtraction
| MINUS E{$$ = -$2;} 
| E MULT E{$$ = $1 * $3 ;} 
| E DIV E { if($3)$$= $1 / $3; else yyerror("Divide by 0");} 
/*|LBRACE E RBRACE{$$= $2;} 
| RBRACE E LBRACE{yyerror("Wrong expression");} */
| NUMBER {$$ = $1;}
| LETTER {$$ = regs[$1];}
;
%%

int main(void)
{
printf("Enter Expression: ");
yyparse();
return 0;
}

int yyerror(char *msg)
{
printf("%s", msg);// printing error
exit(0);
}

Я не могу разрешить конфликты.Также я получаю ошибку сегментации, когда я запускаю его с некоторыми изменениями.Я использую yacc и lex для одного и того же.

1 Ответ

0 голосов
/ 06 июня 2018

Два конфликта сдвига-уменьшения являются результатом того факта, что вам не требуется никакого явного разделителя между операторами.Из-за этого a = b - 3 можно интерпретировать как одно утверждение или как два (a = b; - 3).Второе толкование может показаться вам не очень естественным, но оно легко выводится из грамматики.

Кроме того, использование унарного минуса приводит к неправильному синтаксическому анализу -2/3 как -(2/3) вместо (-2)/3.(Вы можете или не можете найти это серьезным, так как это имеет мало семантических последствий для этих конкретных операторов.) Эта конкретная проблема и правильное решение обсуждаются в руководстве по бизонам и во многих других интернет-ресурсах.

Оба эти объяснения станут немного более наглядными, если вы используете опцию командной строки -v, чтобы составлять описание синтаксического анализатора.См. Понимание вашего синтаксического анализатора (снова в руководстве по бизонам).

...