2016-07-22 13 views
1

저는 표현 표기법과 실제로 후행 표기법을 위해 RPN을 사용하는 간단한 바이트 코드 인터프리터를 만드는 중입니다. 그러나 이제는 다음과 같은 질문을했습니다 : 실제로 단락 회로 평가가 가능합니까? 후위 표현식에 사용됩니까? 예를 들어, 표현식을 평가할 때 (false (& & (계승 (7)> ​​계승 (5))) C++은 두 피연산자에 대한 & & 연산자의 결과가 false로 평가된다는 것을 알고 있기 때문에 & &)는 항상 false입니다. 이제 이것을 RPN에 넣으면 false (7 팩토리얼 팩토리얼>> & &)가됩니다.RPN 단락 회로 평가

효율적인 RPN 표현 구문 분석기를 작성하고자 했으므로 문제점은 다음과 같습니다. 어떻게하면 짧은 회로 평가로 효율적인 RPN 표현 구문 분석기를 만들 수 있습니까?

+0

당신은 코드를 작성합니다. 우리는 당신을 위해 당신의 시스템을 설계하거나, 설계 방법을 가르쳐주지 않습니다. –

+0

@MarcB 내가 추측 한 정보를 주셔서 감사합니다. 어쨌든 나는 유용한 대답을 얻었습니다. 그렇습니다. –

+0

RPN과 후치 표기법은 두 가지가 아니라 동일한 것입니다. RPN 파서를 해석기에 빌드하지 마십시오. 입력은 이미 파싱되어 있으며 선형 적으로 처리 할 수 ​​있습니다. 단락 회로 평가를 원하면 분기를 도입해야합니다. – EJP

답변

1

RPN 표현식은 두 단계로 평가됩니다.

단계 1 : RPN을 구문 분석하고 RPN의 트리 표현을 구성합니다. 예를 들어,이 트리에서 && 노드는 표현식의 각 절반에 대해 두 개의 하위 노드를 갖습니다. 이 트리를 구성하는 과정은 평가 부분을 제외하고는 RPN을 평가하는 것과 거의 동일한 과정입니다. 평가 부분은 새 노드를 구성하고 해당 자식 노드를 새 부모 노드에 연결 한 다음 부모 노드를 다시 RPN 평가 스택.

2 단계 : 재귀 적 디센트를 사용하여 생성 된 트리를 평가합니다. 이 시점에서 단락 회로 평가는 자발적이됩니다. &&의 왼손 아이를 평가 한 다음 실제로 오른손 아이를 평가할지 결정하십시오.

|| 노드 등

+0

감사합니다. 이것이 완벽합니다! :) –

+0

질문 : 대신 RPN 대신 PN을 사용하도록 전환하면 어떻게 될까요? –

+0

물론 첫 번째 단계는 다를 수 있습니다. 트리를 구성하는 다른 논리. 또는 PN 파서는 "무시"플래그를 전달하도록 작성 될 수 있습니다.이 플래그는 입력을 구문 분석 및 평가하지 않고 입력을 평가하지 않고 재귀 적으로 플래그를 전달합니다. '&&'와'||'연산자가 오른쪽 평가를위한 플래그를 설정하고, 왼쪽 평가가 오른쪽을 평가할 필요가 없다면. –