Los bloques implican paréntesis. Por ejemplo, cuando ves los siguientes bloques,
supón que significa -(5 + 2)
, no -5 + 2
porque 5
y 2
son parte de
un bloque, y -
es parte de otro bloque.
Pero si colocas paréntesis alrededor de cada bloque, hace que el código sea mucho
sean legibles. Compara (((5) * (2)) + (3))
con 5 * 2 + 3
. Ambos
se evalúan como lo mismo (13
), pero la segunda es mucho más fácil
para leer.
Las reglas de prioridad del operador de Blockly te ayudan a generar código con el mínimo la cantidad de paréntesis, para una máxima legibilidad.
Generar "correcto" salida
Si no necesitas que el código generado sea legible por humanos, no es necesario no te preocupes por minimizar los paréntesis. Unir cada bloque es un buen enfoque, y garantiza que el código generado siempre se evalúe de forma correcta.
Para garantizar la precisión, siempre pasa las llamadas de Order.ATOMIC
a valueToCode
.
Siempre muestra Order.NONE
desde tu generador de código de bloque.
Genera paréntesis óptimos
Los paréntesis solo deben insertarse si el código generado es incorrecto, sin de ellos. Esto sucede cuando la prioridad de un operador en el bloque externo es es mayor que la precedencia de un operador en el bloque interno.
Por ejemplo, en los siguientes bloques hay un operador de negación unario y un operador de suma. La negación unaria tiene mayor precedencia que la operador de suma.
Por lo tanto, si no agregas paréntesis, obtendrás -5 + 2
y -
se evaluará.
antes de +
, que no coincide con los bloques.
Para indicarle al generador cuándo debe insertar paréntesis, dile la intensidad los diferentes operadores. Si ve que el operador externo es más fuerte que el operador interno, inserta paréntesis para protegerlo.
valueToCode
tiene la prioridad del operador externo, y el resultado
tupla especifica la precedencia del operador interno.
Este es un ejemplo de un bloque que incluye dos operadores:
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];
}
Prioridad de valueToCode
Cuando llamas a valueToCode
para generar el código de un bloque interno, lo pasas
la precedencia del operador más potente que actúa sobre el código del interno
bloque. Este es el operador contra el que se debe proteger el código del bloque interno.
En el siguiente ejemplo, se bloquean tanto el operador de negación unario como el
de suma actúan sobre el código del bloque interno. La negación unaria
es más fuerte, por lo que esa es la prioridad que debes pasar 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`;
Prioridad de la devolución
Cuando muestres una prioridad del generador de código de bloque, precedencia del operador más débil dentro del código del bloque. Este es el que necesita protección.
Por ejemplo, el siguiente bloque contiene un operador de negación unario y un operador de suma. La suma es más débil, por lo que esa es la prioridad que debes del generador de código de bloque.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
Ordenar enumeración
Cada módulo generador de lenguaje define una enum Order
que incluye todos
los precedentes para ese idioma.
Las prioridades más fuertes tienen valores de copia de seguridad más bajos y las más débiles tienen valores de copia de seguridad más altos. Puedes pensar que los grandes precedentes son la "clasificación" más alto" en fortaleza y menos precedencia, como estar "clasificado en una posición más baja" - como si eran luchadores de la competencia.
Aquí puedes encontrar las enumeraciones Order
para todos los idiomas integrados:
Prioridades especiales
La mayoría de las prioridades Las enumeraciones Order
coinciden con las prioridades
definidas por sus respectivos idiomas basados en texto. Pero hay dos tipos
precedencias, Order.ATOMIC
y Order.NONE
.
Order.ATOMIC
es la mayor precedencia. Se usa en los siguientes casos:
- Debes asegurarte de que el código esté siempre entre paréntesis,
por lo que se pasa a
valueToCode
. - Tu bloque no incluye ningún operador, así que lo devuelves desde tu de código de bloque.
Order.NONE
es la prioridad más débil. Se usa en los siguientes casos:
- Debes asegurarte de que el código esté siempre entre paréntesis, por lo que la mostrarás desde el generador de código de bloque.
- No hay operadores que actúen en un bloque interno, así que lo pasas al
valueToCode