Parantez ekleme

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

-(5 + 2) işaretini temsil eden bloklar

Ancak her blokun etrafına parantez işareti koymanız, kodun çok daha okunaklı olmamasına neden olur. (((5) * (2)) + (3)) ile 5 * 2 + 3 karşılaştırmasını yapın. Bu ifadelerin ikisi de aynı şeyi (13) ifade eder, ancak ikincisinin okunması çok daha kolaydır.

Blockly'nin operatör öncelik kuralları, maksimum okunabilirlik için minimum parantez sayısıyla kod oluşturmanıza yardımcı olur.

"Doğru" çıkış oluşturma

Oluşturulan kodunuzun kullanıcıların okuyabileceği şekilde olması gerekmiyorsa parantezleri küçültme 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ğu sağlamak için her zaman Order.ATOMIC-valueToCode çağrısını iletin ve blok kodu oluşturucunuzdan her zaman Order.NONE kodunu döndürün.

En uygun parantezleri oluşturma

Parantezlerin sadece oluşturulan kod olmadan yanlış olması durumunda eklenmesi gerekir. Bu durum, dış bloktaki bir operatörün önceliği iç bloktaki operatörün önceliğinden daha güçlü olduğunda meydana gelir.

Örneğin, aşağıdaki bloklarda tekli olumsuzlama operatörü ve ekleme operatörü bulunmaktadır. Tekli olumsuzlama, ekleme operatöründen daha güçlü bir önceliğe sahiptir.

işaret-ve-toplama

Dolayısıyla, parantez eklemezseniz -5 + 2 alırsınız ve -, bloklarla eşleşmeyen +'den önce değerlendirilir.

Farklı operatörlerin ne kadar güçlü olduğunu söyleyerek parantezleri ne zaman eklemesi gerektiğini oluşturucuya söyleyebilirsiniz. Dış operatörün iç operatörden daha güçlü olduğu tespit edilirse iç operatörü korumak için parantez ekler.

valueToCode, dış operatörün önceliğini alır ve döndürülen operatörün önceliğini belirtir.

İki operatör içeren bir blok örneği aşağıda verilmiştir:

Tekli olumsuzlama operatörü, toplama operatörü ve alt blok içeren bir blok.

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ç bloğun kodunu oluşturmak için valueToCode yöntemini çağırdığınızda bunu, iç bloğun koduna işlem yapan en güçlü operatör'ün önceliğini geçirirsiniz. Bu, iç blokun kodunun korunması gereken operatördür.

Örneğin, aşağıdaki bloklarda hem tekli olumsuzlama operatörü hem de ekleme operatörü iç bloğun koduna hareket etmektedir. Tekli olumsuzlama daha güçlü olduğundan valueToCode öğesine iletmeniz gereken öncelik budur.

Tekli olumsuzlama operatörü, toplama operatörü ve alt blok içeren bir blok.

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

Önceliği döndür

Blok kodu oluşturma aracınızdan bir öncelik döndürdüğünüzde, blok kodu içindeki en zayıf operatörün önceliğini döndürün. Bu, korunması gereken operatördür.

Örneğin, aşağıdaki blok hem tekli olumsuzlama operatörü hem de ekleme operatörü içerir. Ekleme daha zayıftır, dolayısıyla blok kodu oluşturma aracından döndürmeniz gereken öncelik budur.

Tekli olumsuzlama operatörü ve toplama operatörü içeren ve alt blok içermeyen bir blok

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

Sıralandırma sıralaması

Her dil oluşturma aracı modülü, söz konusu dilin tüm önceliklerini içeren bir Order enum tanımlar.

Daha güçlü öncelikler daha düşük yedek değerlere, zayıf öncelikler ise daha yüksek yedekleme değerlerine sahiptir. Güçlü öncelikleri "daha yüksek sıralamaya" sahip olmak, daha zayıf olanları ise "daha alt sıralarda yer almak" olarak düşünebilirsiniz.

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

Özel öncelikler

Oluşturucuların Order numaralandırmalarındaki önceliklerin çoğu, ilgili metin tabanlı dilleri tarafından tanımlanan önceliklerle eşleşir. Ancak iki özel öncelik vardır: Order.ATOMIC ve Order.NONE.

Order.ATOMIC en güçlü önceliktir. Aşağıdaki durumlarda kullanılır:

Order.NONE en zayıf önceliktir. Aşağıdaki durumlarda kullanılır: