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.
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.
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:
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
.
// 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.
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:
- Chcesz upewnić się, że kod jest zawsze w nawiasach,
więc przekazujesz ją
valueToCode
. - Blokada nie zawiera żadnych operatorów, dlatego jest zwracana z z generatorem kodów blokowych.
Order.NONE
to najgorszy priorytet. Jest on używany, gdy:
- Chcesz upewnić się, że kod jest zawsze w nawiasach, tak aby został zwrócony z generatora kodów blokowych.
- Na wewnętrzny blok nie działają żadne operatory, więc przekazujesz go do funkcji
valueToCode