2017-03-23 7 views
1

프로그래밍 언어 클래스에서 나는 연산자 우선 순위와 연관성을 배웠다. 언더 위의 상황에 자유 문법을 사용하여 문맥 자유 문법프로그래밍 언어의 연산자 우선 순위

<expr> -> <expr> + <term> | <term> 
<term> -> <term> * <fact> | <fact> 
<fact> -> (<expr>) | a 

간단하다, 우리가

a+a+(a+a) 

내가 생각하는 문장을 만들 수 있습니다, 작업의 순서는 다음과 같이 수행해야합니다 다음과 같이하십시오 : (a + a) -> a + a 다음에 모두 합합니다. 그러나 강의에서 교수는 (a + a) -> a + a와 a + a -> (a + a) 순서가 옳다고 말했습니다. 학생은 공황 상태에 있습니다. 심지어 아래의 문장에서

(a+a)+((a+a)) 

모두 순서 ((A + A)) -> (A + A) 한 후 플러스 (A + A) -> ((A + A)) 올바른 것입니다. 그는 구문 분석 트리를 만든 다음 어셈블리 언어 으로 변환 했으므로 컴파일러에 따라 순서가 달라집니다.

나는 그의 설명을 이해하지 못한다. 아무도 왜 두 가지 가능한 순서가 있는지 설명 할 수 있습니까 ??

+1

주어진 문법이 모호하다는 점에 유의하십시오. ' + '은 ' * '이어야합니다. –

+0

@MichaelDyck correct. 내 오타 –

답변

1

평가 순서는 그룹화와 관련이 없습니다. X + Y (XY은 하위 표현식 임)을 계산해야하는 경우 먼저 temp2 = Y을 계산 한 다음 temp1 = X을 계산하지 않아도 상관 없습니다. 끝에 temp1 + temp2 같은 값이 있습니다.

오른쪽 인수를 먼저 계산하는 것이 더 편리 할 때도 있습니다. 예를 들어 이전 계산에서 이미 알 수 있습니다.

X 또는 Y의 계산에 부작용이있는 경우이를 고려해야 할 수 있습니다. 일부 언어에서는 부작용이 왼쪽에서 오른쪽으로 발생한다고 주장합니다. 다른 것들은 모든 주문을 허용합니다. 그러나 어떤 경우에도 괄호 그룹화가 계산의주문에 영향을 미치지 않습니다. 계산 대상 만 결정합니다.