괄호 삽입

블록은 괄호를 암시합니다. 예를 들어 다음 블록이 표시되는 경우 -(5 + 2)-5 + 2이 아니라는 뜻으로 가정합니다. 52이 한 블록의 일부이며 -가 다른 블록의 일부입니다.

-(5 + 2)를 나타내는 블록

그러나 모든 블록을 괄호로 묶으면 코드가 훨씬 더 작아집니다. 있습니다. (((5) * (2)) + (3))5 * 2 + 3를 비교합니다. 둘 다 표현식은 같은 항목 (13)으로 평가되지만 두 번째 표현식이 훨씬 더 쉽습니다. 있습니다.

Blockly의 연산자 우선순위 규칙을 사용하면 가독성을 최대화하기 위해 괄호의 개수.

'올바른' 검색어 생성 출력

생성된 코드가 사람이 읽을 수 있는 형태가 아니어도 되는 경우에는 괄호를 최소화하는 것에 대해 걱정할 필요가 없습니다. 모든 블록을 래핑하는 것은 훌륭한 접근 방식이지만 생성된 코드가 항상 올바르게 평가되도록 합니다.

정확성을 보장하려면 항상 Order.ATOMICvalueToCode 호출에 전달합니다. 항상 블록 코드 생성기에서 Order.NONE를 반환합니다.

최적의 괄호 생성

괄호는 생성된 코드가 있습니다. 외부 블록에 있는 연산자의 우선순위가 더 강력합니다.

예를 들어 다음 블록에는 단항 부정 연산자와 덧셈 연산자. 단항 부정이 덧셈 연산자.

부정 및 덧셈

따라서 괄호를 추가하지 않으면 -5 + 2이 발생하고 -이 평가됩니다. 이는 블록과 일치하지 않습니다.+

얼마나 강력한지 알려주어 괄호를 삽입할 시기를 생성기에 알려줄 수 있습니다. 어떻게 다를까요? 외부 연산자가 더 강력한 것으로 확인되면 괄호를 삽입하여 내부 연산자를 보호합니다.

valueToCode는 외부 연산자보다 우선하며 다음 결과를 반환합니다. tuple은 내부 연산자의 우선순위를 지정합니다.

다음은 두 연산자가 포함된 블록의 예입니다.

단항 부정 연산자와 더하기 연산자, 하위 요소가 있는 블록
차단될 수 있습니다.

import {javascriptGenerator, Order} from 'blockly/javascript';

javascriptGenerator.forBlock['negate_plus_two'] = function(block, generator) {
  // valueToCode takes in the precedence of the outer operator.
  const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
  const code = `-${innerCode} + 2`;
  // The return tuple specifies the precedence of the inner operator.
  return [code, Order.ADDITION];
}

valueToCode 우선순위

valueToCode를 호출하여 내부 블록의 코드를 생성할 때 이를 전달합니다. 내부 연산자의 코드에 대해 작동하는 가장 강력한 연산자의 우선순위 차단될 수 있습니다. 내부 블록의 코드를 보호해야 하는 연산자입니다.

예를 들어 다음 블록에서는 단항 부정 연산자와 더하기 연산자가 내부 블록의 코드에 대해 작동하는 것입니다. 단항 부정 더 강력하므로 valueToCode에 전달해야 합니다.

단항 부정 연산자와 더하기 연산자, 하위 요소가 있는 블록
차단될 수 있습니다.

// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;

반품 우선순위

블록 코드 생성기에서 우선순위를 반환하면 우선순위가 가장 높은 약한 연산자의 우선순위를 지정합니다. 이것은 통신사업자입니다.

예를 들어 다음 블록에는 단항 부정 연산자와 덧셈 연산자. 추가할 내용이 더 약하므로 이 우선순위에 따라 반환합니다.

단항 부정 연산자와 더하기 연산자가 있고 하위 요소가 없는 블록
차단하다

const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];

주문 enum

모든 언어 생성기 모듈은 Order enum을 정의하고 우선순위를 지정할 수 있습니다

우선순위가 높을수록 지원 값이 낮고 우선순위가 낮을수록 지원 값이 더 높기 때문입니다. 높은 우선순위는 '순위 지정'으로 높음" 우선순위가 낮은 순위는 '낮은 순위'가 됨 마치 전사적인 경쟁자였습니다.

다음은 모든 기본 제공 언어의 Order enum을 찾을 수 있는 위치입니다.

특수 우선순위

생성기의 Order enum이 우선순위와 일치 해당 텍스트 기반 언어로 정의됩니다. 두 가지 특별한 Order.ATOMICOrder.NONE를 지원합니다.

Order.ATOMIC이 가장 강력한 우선순위입니다. 이 속성은 다음과 같은 경우에 사용됩니다.

  • 코드는 항상 괄호로 묶어야 합니다. 따라서 valueToCode에 전달합니다.
  • 블록에 연산자가 포함되어 있지 않으므로 블록 코드 생성기를 사용합니다.

Order.NONE은 가장 약한 우선순위입니다. 이 속성은 다음과 같은 경우에 사용됩니다.

  • 코드는 항상 괄호로 묶어야 합니다. 따라서 블록 코드 생성기에서 반환합니다.
  • 내부 블록에 작동하는 연산자가 없으므로 내부 블록에 전달합니다. valueToCode