I blocchi sottintendono parentesi. Ad esempio, quando vedi i seguenti blocchi,
presupponi che significa -(5 + 2)
e non -5 + 2
perché 5
e 2
fanno parte di
in un blocco, mentre -
fa parte di un altro.
Ma se racchiudi ogni blocco tra parentesi, il codice diventa molto meno
leggibili. Confronta (((5) * (2)) + (3))
con 5 * 2 + 3
. Entrambe le opzioni
le espressioni restituiscono la stessa cosa (13
), ma la seconda è molto più semplice
per leggere.
Le regole di precedenza degli operatori di Blockly consentono di generare codice con il minimo di parentesi tonde per ottenere la massima leggibilità.
Genera informazioni "corrette" output
Se non è necessario che il codice generato sia leggibile, non è necessario preoccuparsi di ridurre al minimo le parentesi. Aggregare ogni blocco è un approccio corretto, e garantisce che il codice generato venga sempre valutato correttamente.
Per garantire la correttezza, trasmetti sempre Order.ATOMIC
a valueToCode
chiamate e
restituisce sempre Order.NONE
dal generatore di codici a blocchi.
Generare parentesi ottimali
Le parentesi devono essere inserite solo se il codice generato non è corretto senza che li rappresentano. Ciò accade quando la precedenza di un operatore nel blocco esterno è maggiore della precedenza di un operatore nel blocco interno.
Ad esempio, nei blocchi seguenti sono presenti un operatore di negazione unaria e un operatore di addizione. La negazione unaria ha una precedenza più forte rispetto operatore di addizione.
Quindi se non aggiungi parentesi ottieni -5 + 2
e -
viene valutato
prima di +
, che non corrisponde ai blocchi.
Puoi indicare al generatore quando inserire le parentesi indicando l'efficacia dai vari operatori. Se vede che l'operatore esterno è più forte rispetto all'operatore interno, inserisce parentesi per proteggere l'operatore interno.
valueToCode
ha la precedenza sull'operatore esterno e il ritorno
tupla specifica la precedenza dell'operatore interno.
Di seguito è riportato un esempio di un blocco che include due operatori:
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];
}
Precedenza valueToCode
Quando chiami valueToCode
per generare il codice di un blocco interno, lo passi
la precedenza dell'operatore più potente che agisce sul codice dell'interfaccia
bloccare. Questo è l'operatore da cui deve essere protetto il codice del blocco interno.
Ad esempio, nei blocchi che seguono sia l'operatore di negazione unaria che
l'operatore di addizione agisce sul codice del blocco interno. La negazione unaria
è più forte, quindi questa è la precedenza da trasmettere a valueToCode
.
// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
Precedenza restituita
Quando restituisci una precedenza dal generatore di codici a blocchi, restituisci il valore precedenza dell'operatore più debole all'interno del codice del blocco. Questo è il da proteggere.
Ad esempio, il blocco seguente contiene sia un operatore di negazione unaria sia un operatore di addizione. L'aggiunta è più debole, quindi questa è la precedenza su cui dovresti il generatore di codice a blocchi.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
Enum dell'ordine
Ogni modulo del generatore di linguaggio definisce un'enumerazione Order
che include tutti
le precedenti per quella lingua.
Le priorità più elevate hanno valori di supporto più bassi, mentre le precedenti più deboli hanno valori di supporto più bassi. con valori di supporto più elevati. Le forti precedenza sono considerate "classificate" superiore" in termini di forza e più deboli in termini di "ranking più basso" - come se fossero erano combattenti competitivi.
Ecco dove puoi trovare le enumerazioni Order
per tutte le lingue integrate:
Precedenza speciali
La maggior parte delle precedenza nei generatori Order
enum corrispondono alle precedenti
definiti dalle rispettive lingue di testo. Ma ci sono due speciali
precedenti, Order.ATOMIC
e Order.NONE
.
Order.ATOMIC
è la priorità più elevata. Viene utilizzata quando:
- Vuoi garantire che il codice sia sempre tra parentesi,
quindi lo passi a
valueToCode
. - Il tuo blocco non include operatori, quindi lo restituisci dal un generatore di blocchi di codice.
Order.NONE
è la precedenza più debole. Viene utilizzata quando:
- Vuoi garantire che il codice sia sempre tra parentesi, quindi lo restituisci dal generatore di codice a blocchi.
- Non ci sono operatori che agiscono su un blocco interno, quindi lo passi
valueToCode
.