Parantez ekleme

Bloklar parantez anlamına gelir. Örneğin, aşağıdaki blokları gördüğünüzde, 5 ve 2, şu değerin bir parçası olduğu için -5 + 2 değil -(5 + 2) anlamına geldiğini varsayalım bir blok ve - başka bir bloğun parçası.

-(5 + 2) ifadesini temsil eden bloklar

Ancak her bloğun başına parantez koyarsanız kod okunabilir. (((5) * (2)) + (3)) ile 5 * 2 + 3 karşılaştırması. Bu iki ifadeler aynı anlama geliyor (13) ancak ikincisi çok daha kolay okudu.

Blockly'nin operatör önceliği kuralları, minimum düzeyde değeri girin.

"Doğru" ifadesini oluşturma çıktı

Oluşturulan kodunuzun okunabilir olması gerekmiyorsa koda gerek yoktur. parantezi en aza indirme konusunda endişelenmenize gerek yoktur. Her bloku sarmalamak iyi bir yaklaşımdır. ve oluşturulan kodunuzun her zaman doğru şekilde değerlendirilmesini sağlar.

Doğruluğundan emin olmak için Order.ATOMIC hizmetini her zaman valueToCode çağrılarına iletin ve her zaman blok kodu oluşturma aracınızdan Order.NONE değerini döndürün.

En uygun parantezleri oluştur

Parantez yalnızca, oluşturulan kod olmadan yanlış değer girildiğinde eklenmelidir gerekir. Bu, dış bloktaki bir operatörün önceliği iç bloktaki bir operatörün önceliğinden daha güçlüdür.

Örneğin, aşağıdaki bloklarda tekli olumsuzlama operatörü ve ekleme operatörü. Tekli olumsuzlama, ekleme operatörü.

olumsuz-ekle ve-ekle

Dolayısıyla, parantez eklemezseniz -5 + 2 alırsınız ve - değerlendirilir + karakterinden önce yer almalıdır.

Oluşturucuya ne kadar güçlü olduğunu söyleyerek parantez eklemesi gerektiğini söyleyebilirsiniz emin olmanız gerekir. Dış operatörün daha güçlü olduğunu görürse iç operatöre oranla iç operatörü korumak için parantez ekler.

valueToCode, dış operatöre göre önceliklidir ve döndürme Tuple, iç operatörün önceliğini belirtir.

Aşağıda, iki operatör içeren bir blok örneği verilmiştir:

Tekli olumsuzlama operatörü, ekleme operatörü ve alt öğe içeren blok
engelleyebilirsiniz.

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 önceliği

Bir iç blokun kodunu oluşturmak için valueToCode çağrısı yaptığınızda, kodu iletirsiniz iç hücrenin koduna etki eden en güçlü operatörün önceliği engelleyebilirsiniz. Bu, iç blok kodunun korunması gereken operatördür.

Örneğin, aşağıdakinde hem tekli olumsuzlama operatörü hem de ekleme operatörü iç blokun koduna göre hareket eder. Tekli olumsuzlama daha güçlüdür; bu nedenle valueToCode öğesine iletmeniz gereken öncelik budur.

Tekli olumsuzlama operatörü, ekleme operatörü ve alt öğe içeren blok
engelleyebilirsiniz.

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

İade önceliği

Blok kodu oluşturucunuzdan bir öncelik döndürdüğünüzde, bloğun kodundaki en zayıf operatörün önceliğini. Bu, işlecini kullanın.

Örneğin, aşağıdaki blok hem tekli olumsuzlama operatörü hem de ekleme operatörü. Ekleme daha zayıf olduğundan, eklemeniz gereken öncelik budur. işlemi tekrarlandığından emin olun.

Tekli olumsuzlama operatörü ve ekleme operatörü olan, alt öğesi olmayan blok
engelle

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

Sipariş sıralaması

Her dil oluşturucu modülü, şunları içeren bir Order sıralaması tanımlar: önceliklerini belirleyin.

Daha güçlü öncelikler daha düşük yedekleme değerlerine sahiptir ve daha zayıf öncelikler daha yüksek yedek değerleri sunar. Güçlü öncelikleri, "sıralama" olarak daha yüksek" gücü daha düşük, "daha düşük sırada" ise sanki rekabetçi savaşçılardı.

Tüm yerleşik diller için Order sıralamalarını burada bulabilirsiniz:

Özel öncelikler

Oluşturucuların önceliklerinin çoğu Order numaralandırmaları önceliklerle eşleşiyor ilgili metin tabanlı dillerine göre tanımlanır. Ama iki özel husus var öncelikler, Order.ATOMIC ve Order.NONE.

Order.ATOMIC en güçlü önceliktir. Şu durumlarda kullanılır:

Order.NONE en zayıf önceliktir. Şu durumlarda kullanılır: