درج پرانتز

بلوک ها دلالت بر پرانتز دارند. به عنوان مثال، وقتی بلوک های زیر را می بینید، فرض می کنید به معنای -(5 + 2) است نه -5 + 2 زیرا 5 و 2 بخشی از یک بلوک هستند و - بخشی از یک بلوک دیگر است.

بلوک های نشان دهنده -(5 + 2)

اما اگر دور هر بلوک پرانتز قرار دهید، خوانایی کد بسیار کمتر می شود. (((5) * (2)) + (3)) با 5 * 2 + 3 مقایسه کنید. هر دوی این عبارات به یک چیز ارزیابی می شوند ( 13 ) اما خواندن دومی بسیار آسان تر است.

قوانین تقدم عملگر Blockly به شما کمک می کند کدی را با حداقل تعداد پرانتز تولید کنید تا حداکثر خوانایی داشته باشید.

خروجی "درست" تولید کنید

اگر نیازی ندارید که کد تولید شده شما قابل خواندن توسط انسان باشد، دیگر نیازی به نگرانی در مورد کوچک کردن پرانتزها نیست. بسته بندی هر بلوک یک رویکرد خوب است و تضمین می کند که کد تولید شده شما همیشه به درستی ارزیابی می شود.

برای اطمینان از صحت، همیشه Order.ATOMIC به فراخوانی های valueToCode منتقل کنید و همیشه Order.NONE از تولیدکننده کد بلاک خود برگردانید.

ایجاد پرانتز بهینه

پرانتزها فقط در صورتی باید درج شوند که کد تولید شده بدون آنها نادرست باشد. این زمانی اتفاق می‌افتد که تقدم یک عملگر در بلوک بیرونی قوی‌تر از تقدم عملگر در بلوک داخلی باشد.

به عنوان مثال، در بلوک های زیر یک عملگر نفی یکنواخت و یک عملگر جمع وجود دارد. نفی یکنواخت اولویت قوی تری نسبت به عملگر جمع دارد.

نفی و اضافه

بنابراین اگر پرانتز اضافه نکنید -5 + 2 دریافت می کنید، و - قبل از + ارزیابی می شود، که با بلوک ها مطابقت ندارد.

با گفتن اینکه اپراتورهای مختلف شما چقدر قوی هستند، می توانید به ژنراتور بگویید که چه زمانی پرانتز را وارد کند. اگر ببیند که عملگر خارجی قویتر از عملگر داخلی است، برای محافظت از عملگر داخلی، پرانتزها را وارد می کند.

valueToCode اولویت عملگر بیرونی را می گیرد و تاپل بازگشتی اولویت عملگر داخلی را مشخص می کند.

در اینجا یک مثال برای بلوکی است که شامل دو عملگر است:

یک بلوک با یک عملگر نفی یکنواخت و یک عملگر جمع و یک بلوک فرزند.

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 را برای تولید کد یک بلوک داخلی فراخوانی می‌کنید، آن را در اولویت قوی‌ترین عملگر فعال بر روی کد بلوک داخلی قرار می‌دهید. این اپراتوری است که کد بلوک داخلی باید از آن محافظت شود.

به عنوان مثال، در بلوک‌های زیر هم عملگر نفی واحد و هم عملگر جمع بر روی کد بلوک داخلی عمل می‌کنند. نفی unary قوی تر است، بنابراین اولویتی است که باید به 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];

تعداد را سفارش دهید

هر ماژول مولد زبان یک Order enum را تعریف می کند که شامل تمام اولویت های آن زبان است.

اولویت های قوی تر دارای مقادیر پشتوانه پایین تری هستند و اولویت های ضعیف تر دارای مقادیر پشتوانه بالاتری هستند. شما می‌توانید اولویت‌های قوی را به‌عنوان «رتبه‌های بالاتر» در قدرت، و اولویت‌های ضعیف‌تر به‌عنوان «رتبه‌های پایین‌تر» در نظر بگیرید - گویی جنگجویان رقابتی هستند.

در اینجا می‌توانید فهرست‌های Order را برای همه زبان‌های داخلی پیدا کنید:

اولویت های خاص

بیشتر اولویت‌ها در فهرست‌های Order تولیدکنندگان با اولویت‌های تعریف‌شده توسط زبان‌های مبتنی بر متن مربوطه مطابقت دارند. اما دو اولویت ویژه وجود دارد، Order.ATOMIC و Order.NONE .

Order.ATOMIC قوی ترین اولویت است. زمانی استفاده می شود که:

  • شما می خواهید مطمئن شوید که کد همیشه پرانتز است ، بنابراین آن را به valueToCode ارسال می کنید.
  • بلوک شما شامل هیچ عملگر نمی‌شود، بنابراین آن را از تولیدکننده کد بلاک خود برمی‌گردانید.

Order.NONE ضعیف ترین اولویت است. زمانی استفاده می شود که:

  • می‌خواهید مطمئن شوید که کد همیشه پرانتز است ، بنابراین آن را از تولیدکننده کد بلاک خود برمی‌گردانید.
  • هیچ عملگر روی یک بلوک داخلی وجود ندارد، بنابراین آن را به valueToCode ارسال می کنید.