2013-05-06 2 views
2

제 컴파일러 과정 할당의 언어는 괄호없는 표현식에서 혼합 연산자를 허용하지 않으므로 우선 순위를 처리하지 못하는 것으로 추정됩니다.혼합 연산자가없는 표현식을 파싱 할 때 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;을 추가 한 다음 어떻게 든 addexprmulexpr 2 개 이상의 조건을 필요로하게,하지만이 표현하는 방법을 알아낼 수 없습니다해야한다는 것입니다.

업데이트 : "해결책"을 발견했지만 "코드"의 중복이 적 으면 수용 할 수 있습니다.

답변

2

mulexpraddexpr에 대한 재귀 정지 조건이 두 용어의 표현이 될 만드는 것은 작동합니다..

expr : mulexpr 
    | addexpr 
    | term 
    ; 

mulexpr : mulexpr '*' term 
     | term '*' term 
     ; 

addexpr : addexpr '+' term 
     | term '+' term 
     ; 

(곱슬이 밖으로 질문을 게시 한 후 SO 큰 고무 오리있게 5 초 I을 내 뇌가 그런 종류의 중복을 피하려고 강박적으로 시도한 것 같아요.)

관련 문제