원 패스 해석기 방식을 유지하면서 원하는 결과를 얻는 방법은 평가가 수행되는지 여부를 제어하는 전역 플래그를 사용하는 것입니다 (해당 플래그가 false
으로 설정되어있는 동안 구문 분석 규칙이 정상적으로 구문 분석됩니다). ,하지만 당신은 if
에서 각 작업을 묶어 달성 할 것, 이는 아무것도 실행합니다. 규칙을 다음 중반 규칙 작업 또는 조건에 따라이 플래그를 설정 특수 구문 분석 규칙을 호출 할 수 삼항 연산자.
이 문제를 해결하는 올바른 방법은 파서에서 프로그램을 직접 실행하지 말고 파서가 AST (또는 다른 인터 메디아 테 표현을 원할 경우), 추가 단계에서 프로그램을 실행하기 위해 걸어갑니다.
그런 단계에서 조건을 평가 한 후 평가할 분기를 쉽게 결정할 수 있습니다. 그 논리는 다음과 같습니다.
class TernaryOperator : public IntExpression {
// ...
public:
int eval() {
if(condition.eval()) {
return then_branch.eval();
} else {
return else_branch.eval();
}
}
}
물론 위의 예는 방문자 패턴을 사용하여 작성하는 것이 좋습니다.