2016-07-02 3 views
0

제 컴파일러 디자인 교수는 성명을 평가하는 동안 모든 토큰을 후위 표기법으로 변환한다고 전했습니다. 함수 호출 외의 모든 것은 중위 표기법으로되어 있으므로 접미사로 변환해야합니다. 함수는 접두사로 중침 표기법으로되어 있지 않습니다. 그래서 그들은 개종해야합니다. 접두어 표기법으로 +(a,b) 또는 +ab과 동등한 것으로 중기의 a+b이 증명 될 수 있습니다.접두어 표기법에 대한 접미사의 이점

그러나 왜 우리는 모든 것을 후위 기호로 바꾸고 대신 표기법을 바꾸어야하는지 이해하지 못합니까? 함수는 이미 접두어로되어 있으므로 비 함수 엔티티를 접두사 표기법으로 변환하고 역순으로 실행하는 것이 더 빠르지 않아야합니까?

답변

3

강사가 설명하는 접근 방식은 표현식을 구문 분석 할 수있는 방법 중 하나이지만, 유일한 방법은 아닙니다. 기본적으로 구문 분석의 목표는 표현식을 작업하기 쉽고 해석하기 쉬운 형식으로 가져오고 접두사 및 접미사 표기법이 이러한 요구 사항을 충족시키는 것입니다. 실제 컴파일러에서는 추상 구문 트리, 즉 입력 구조를 인코딩하는 트리를 만드는 것이 훨씬 더 일반적이며 접두사 및 접미사 표기법을 해당 트리의 사전 주문 또는 후순위 게시로 생각할 수 있습니다.

효율면에서 - 접두어와 접미사 표기법을 사용하는 비용의 실제 차이는 간단하며 컴파일러에서 병목 현상이되지는 않습니다. 일반적으로 컴파일러에서 가장 시간 집약적 인 단계는 최적화이며 파싱에는 시간이 거의 들지 않습니다. 문제를 유발한다는 구체적인 증거가 나올 때까지 파싱의 효율성을 걱정하지 않겠습니다.

+0

감사합니다. 의심의 여지가 없습니다. 그러나 인터프리터에 갈 경우 구문 분석 및 접미사/접두사로 변환하면 시스템의 병목 현상이 발생합니까? – Crimson7

+0

나는 그것을 심각하게 의심한다. 파싱 ​​비용은 일회성으로 거의 확실하게 병목 현상이 아닙니다. 일반적으로, 파싱하는 동안 어리석게 비효율적 인 일을하지 않으면 문제가되지 않습니다. – templatetypedef

+0

또한, 다른 것보다 더 느린 것이 확실합니까? 나는 두 가지 방법으로 변환을 수행 할 때 알고있는 알고리즘을 생각하고 있으며 런타임 측면에서 대략 비교할 수 있어야합니다. – templatetypedef

관련 문제