나는 텍스트 파일에서 표현의 수 (한 줄에 하나씩)를 해결하는 산술 표현을위한 문법을 가지고있다. YACC를 컴파일하는 동안 메시지 2 교대가 충돌을 줄이려고합니다. 하지만 제 계산은 적절합니다. 구문 분석기가 적절한 출력을 제공하면 교대/축소 충돌을 어떻게 해결할 수 있습니까? 그리고 제 경우에는 YACC 문법에서 그것을 해결할 방법이 있습니다.파서는 shift/reduce 충돌을 어떻게 해결합니까?
YACC 문법 내 문법 이러한 충돌을 제거하기 위해 무엇을해야 변화
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