2012-06-19 4 views
1

저는 인터럽터를 사용하여 자신의 연산자를 정의 할 수 있습니다. 목표는 exp op exp op exp과 같이 보이는 AST를 취하여 두 연산자의 상대적 우선 순위와 연관성에 따라 exp op (exp op exp) 또는 (exp op exp) op exp으로 변환하는 것입니다. 언어는 동적이므로 사용할 연산자의 버전을 알 수있는 유일한 방법은 첫 번째 표현식을 평가하고 어떤 버전의 op을 사용할지 묻는 것입니다.올바른 연관 단락 회로 연산자가 있습니까

한편

op|| 경우 때문에 우리는 두 번째 식을 계산할 수 없다 (통상적으로 사용되는) 제 expfalse이면 우리가 단락 할 수 있어야한다는 것이 중요하다.

일부 연산자가 올바른 연결 및 단락 회로 모두에 문제가 발생할 수 있습니다. 내 질문에 거기에 공통적으로 사용하는 오른쪽 연관, 단락 연산자 ("공통"의 선택한 값에 대한)?

N.b. 대입은 파서가 별도로 처리하므로 =은 연산자가 아니며 a (op)= ba = a op b의 구문 설탕입니다.

+0

사실 올바른 연관성은 훨씬 더 의미가 있습니다. 'a or b or c or d or e'의 파스 트리를 시각화 해보십시오. 왼쪽 연관성이 있고 'a'가 참일 때, 우리는 나무 위로 올라가고 위로 올라가 정상에 오르게됩니다. 우회적 인 경우, 'a'가 맞으면 타 - 다, 끝났어! 나머지 부분은 무시하는 것이 훨씬 쉽습니다. 옳은 연관성에 문제가있는 이유는 무엇입니까? 그들은 둘 다 같은 행동 IMHO 있습니다. –

답변

1

Boolean implication 일 수 있습니다. 때 이후로는

a → (b → c) 

및 부울 의미는 아마도 단락해야 괄호로해야한다고 제안 "a가 b는 C를 의미하는 것을 의미한다"로

은 아마

a → b → c 

을 읽을 것 가 거짓이면 (a → b)의 오른쪽은 결과와 관련이 없습니다.

+0

흥미 롭습니다! 오른쪽에 연결되어있는 동안 ** 왼쪽 **에 단락됩니다. 즉 'a'는 항상 평가되지만 'b'는 'a'가 아닌 'c'로 그룹화됩니다. 나는 여전히 합법적으로'a'를'→'의 의미를 찾아내는 것으로 평가할 수 있습니다. –

+0

@ JohnF.Miller, 다른 올바른 연관 연산자는 대개 잘 정의 된 언어로 왼쪽에서 오른쪽으로 평가합니다. 대입은 보통 오른쪽 연관이지만, JavaScript에서는 lhs가 rhs :'var x = 42; var y = []; (x = y) [0] = x;'는 프로그램과 같은 상태로 끝납니다. var y = []; x = y [0] = y;'. 나는 자바가 똑같이한다고 믿는다. 파이썬은 할당을 하위 표현식으로 허용하지 않습니다. C, C++ 및 OCaml은 평가 순서를 지정하지 않습니다. –

관련 문제