Wstawianie nawiasu

Blokady zawierają nawiasy. Na przykład gdy widzisz następujące bloki, Zakładam, że oznacza to -(5 + 2), a nie -5 + 2, ponieważ 5 i 2 są częścią jeden blok, a - jest częścią innego.

bloki reprezentujące -(5 + 2)

Jeśli jednak umieścisz każdy blok w nawiasach, kod będzie znacznie mniej czytelna. Porównaj: (((5) * (2)) + (3)) z: 5 * 2 + 3. Obie opcje wyrażenia zwracają takie same wartości (13), ale drugie wyrażenie jest znacznie łatwiejsze aby przeczytać.

Reguły pierwszeństwa operatorów Blockly pomagają generować kod z minimalną wartością nawiasów, aby zapewnić maksymalną czytelność.

Wygeneruj „prawidłowe” dane wyjściowe

Jeśli nie chcesz, aby wygenerowany kod był czytelny dla człowieka, nie ma potrzeby nie musisz ograniczać się do nawiasów. Umieszczanie wszystkich bloków jest dobrym podejściem, i zadba o to, aby wygenerowany kod był zawsze poprawnie oceniany.

Aby zapewnić poprawność, zawsze przekazuj połączenia Order.ATOMIC do valueToCode. zawsze zwracaj Order.NONE z generatora kodów blokowych.

Wygeneruj optymalne nawiasy

Nawiasy należy wstawiać tylko wtedy, gdy wygenerowany kod jest nieprawidłowy bez . Dzieje się tak, gdy pierwszeństwo operatora w bloku zewnętrznym jest jest silniejszy niż pierwszeństwo operatora w bloku wewnętrznym.

Na przykład w poniższych blokach jest jednoargumentowy operator negacji oraz operator dodawania. Jednoargumentowa negacja ma silniejszy pierwszeństwo niż operator dodawania.

negatywne i dodawanie

Jeśli nie dodasz nawiasów, otrzymasz -5 + 2, a - zostanie obliczony przed +, który nie pasuje do bloków.

Możesz poinformować generatora, kiedy ma wstawić nawiasy, podając mu siłę z różnych operatorów. Jeśli wykryje, że operator zewnętrzny jest silniejszy niż operator wewnętrzny, wstawia nawiasy, aby chronić operator wewnętrzny.

valueToCode ma pierwszeństwo przed operatorem zewnętrznym, a zwrot krotka określa pierwszeństwo operatora wewnętrznego.

Oto przykład bloku zawierającego 2 operatory:

Blok z jednoargumentowym operatorem negacji, operatorem dodawania i operatorem podrzędnym.
blokować.

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];
}

Pierwszeństwo valueToCode

Wywołanie funkcji valueToCode w celu wygenerowania kodu bloku wewnętrznego powoduje jego przekazanie pierwszeństwo najsilniejszego operatora działającego na kodzie wewnętrznego kodu blokować. Jest to operator, przed którym ma być chroniony kod bloku wewnętrznego.

Na przykład w poniższym przykładzie blokowany jest zarówno jednoargumentowy operator negacji, jak i parametr operator dodawania działa na kodzie bloku wewnętrznego. Jednoargumentowa negacja jest silniejszy, dlatego należy przekazać je do valueToCode.

Blok z jednoargumentowym operatorem negacji, operatorem dodawania i operatorem podrzędnym.
blokować.

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

Przywróć pierwszeństwo

Po zwróceniu pierwszeństwa z generatora kodów blokowych zwracaj parametr pierwszeństwo najsłabszego operatora w kodzie bloku. To jest który wymaga ochrony.

Na przykład poniższy blok zawiera zarówno jednoargumentowy operator negacji, jak i operator dodawania. Dodawanie jest słabsze, więc ten ma pierwszeństwo z generatora kodów blokowych.

Blok z jednoargumentowym operatorem negacji i operatorem dodawania bez operatora podrzędnego
blokuj

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

Wyliczenie zamówień

Każdy moduł generatora języka definiuje wyliczenie Order, które zawiera wszystkie ma pierwszeństwo w tym języku.

Silniejszy pierwszeństwo mają niższe wartości wsteczne, a słabszy – dla wyższych wartości bazowych. Możesz je sobie wyobrazić jako „ocenianie” wyżej” słabszą pozycję w rankingu, – jakby to było rywalizowali ze sobą wojownicy.

Tutaj znajdziesz wyliczenia Order dla wszystkich języków wbudowanych:

Pierwszeństwo specjalne

Większość pierwszeństwa w sekcji generatory Wyliczenia Order pasują do pierwszeństwa zdefiniowane w odpowiednich językach tekstowych. Są jednak 2 szczególne pierwszeństwa, Order.ATOMIC i Order.NONE.

Order.ATOMIC ma najsilniejszy priorytet. Jest on używany, gdy:

Order.NONE to najgorszy priorytet. Jest on używany, gdy: