제 컴파일러 과정 할당의 언어는 괄호없는 표현식에서 혼합 연산자를 허용하지 않으므로 우선 순위를 처리하지 못하는 것으로 추정됩니다.혼합 연산자가없는 표현식을 파싱 할 때 reduce/reduce 충돌이 발생했습니다.
# Valid
1 + 2 + 3
1 + (2 * 3)
1
을하지만이되지 않습니다 : :이 다음은 유효한 표현을 의미
# Invalid
1 + 2 * 3
을 둘 다 빈 표현이다. 내 실제 문법에서 발췌, 표현은 다음과 같이 해석한다 :
%token TNumber
%start expr
%%
expr : mulexpr
| addexpr
;
mulexpr : mulexpr '*' term
| term
;
addexpr : addexpr '+' term
| term
;
term : '(' expr ')'
| TNumber
;
그러나, 이것은 감소/감소 갈등 불면. 저는 을 추측합니다입니다. 123
과 같은 단일 용어 표현은 TNumber -> term -> mulexpr -> expr
또는 TNumber -> term -> addexpr -> expr
으로 줄일 수 있기 때문에 그럴 수 있습니다. 모호성이 내가 생각하는 바를 기대하기보다는 문법을 모호하게 만드는 것이 더 좋습니다. 그러나, 나는이 모호성을 해결할 수있는 방법을 생각해 낼 수 없다.
나의 생각은 내가 규칙 expr : term;
을 추가 한 다음 어떻게 든 addexpr
및 mulexpr
2 개 이상의 조건을 필요로하게,하지만이 표현하는 방법을 알아낼 수 없습니다해야한다는 것입니다.
업데이트 : "해결책"을 발견했지만 "코드"의 중복이 적 으면 수용 할 수 있습니다.