2014-11-26 5 views
0

양측 계산 피하기 : 숫자와 표현에 대한삼항 연산자, 나는 삼항 연산자 내 문법이 규칙이

Int: 
    Boolean '?' Int ':' Int {if($1==1) $$=$3; else $$=$5;} 
    | ... 

를이 잘 작동하지만 a 정수 때이 코드가 있다고 가정

a=5 

1==1 ? a++ : a++ 
cout<<a;// now a==6 is the correct print but I got a==7 

':'의 양쪽이 계산되지만 한 면만 필요합니다. 어떻게 들소에서 할 수 있습니까?

답변

2

원 패스 해석기 방식을 유지하면서 원하는 결과를 얻는 방법은 평가가 수행되는지 여부를 제어하는 ​​전역 플래그를 사용하는 것입니다 (해당 플래그가 false으로 설정되어있는 동안 구문 분석 규칙이 정상적으로 구문 분석됩니다). ,하지만 당신은 if에서 각 작업을 묶어 달성 할 것, 이는 아무것도 실행합니다. 규칙을 다음 중반 규칙 작업 또는 조건에 따라이 플래그를 설정 특수 구문 분석 규칙을 호출 할 수 삼항 연산자.


이 문제를 해결하는 올바른 방법은 파서에서 프로그램을 직접 실행하지 말고 파서가 AST (또는 다른 인터 메디아 테 표현을 원할 경우), 추가 단계에서 프로그램을 실행하기 위해 걸어갑니다.

그런 단계에서 조건을 평가 한 후 평가할 분기를 쉽게 결정할 수 있습니다. 그 논리는 다음과 같습니다.

class TernaryOperator : public IntExpression { 
    // ... 
    public: 
    int eval() { 
     if(condition.eval()) { 
     return then_branch.eval(); 
     } else { 
     return else_branch.eval(); 
     } 
    } 
} 

물론 위의 예는 방문자 패턴을 사용하여 작성하는 것이 좋습니다.