블록은 괄호를 암시합니다. 예를 들어 다음 블록이 표시되는 경우
-(5 + 2)
이 -5 + 2
이 아니라는 뜻으로 가정합니다. 5
와 2
이
한 블록의 일부이며 -
가 다른 블록의 일부입니다.
그러나 모든 블록을 괄호로 묶으면 코드가 훨씬 더 작아집니다.
있습니다. (((5) * (2)) + (3))
와 5 * 2 + 3
를 비교합니다. 둘 다
표현식은 같은 항목 (13
)으로 평가되지만 두 번째 표현식이 훨씬 더 쉽습니다.
있습니다.
Blockly의 연산자 우선순위 규칙을 사용하면 가독성을 최대화하기 위해 괄호의 개수.
'올바른' 검색어 생성 출력
생성된 코드가 사람이 읽을 수 있는 형태가 아니어도 되는 경우에는 괄호를 최소화하는 것에 대해 걱정할 필요가 없습니다. 모든 블록을 래핑하는 것은 훌륭한 접근 방식이지만 생성된 코드가 항상 올바르게 평가되도록 합니다.
정확성을 보장하려면 항상 Order.ATOMIC
를 valueToCode
호출에 전달합니다.
항상 블록 코드 생성기에서 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.ATOMIC
및 Order.NONE
를 지원합니다.
Order.ATOMIC
이 가장 강력한 우선순위입니다. 이 속성은 다음과 같은 경우에 사용됩니다.
- 코드는 항상 괄호로 묶어야 합니다.
따라서
valueToCode
에 전달합니다. - 블록에 연산자가 포함되어 있지 않으므로 블록 코드 생성기를 사용합니다.
Order.NONE
은 가장 약한 우선순위입니다. 이 속성은 다음과 같은 경우에 사용됩니다.
- 코드는 항상 괄호로 묶어야 합니다. 따라서 블록 코드 생성기에서 반환합니다.
- 내부 블록에 작동하는 연산자가 없으므로 내부 블록에 전달합니다.
valueToCode