Blöcke implizieren Klammern. Wenn Sie beispielsweise die folgenden Blöcke sehen, gehen Sie davon aus, dass -(5 + 2)
und nicht -5 + 2
gemeint ist, da 5
und 2
zu einem Block gehören und -
zu einem anderen.
Wenn Sie jedoch jeden Block in Klammern setzen, wird der Code viel weniger lesbar. (((5) * (2)) + (3))
mit 5 * 2 + 3
vergleichen Beide Ausdrücke führen zum selben Ergebnis (13
), der zweite ist jedoch viel leichter zu lesen.
Mit den Operatorprecedence-Regeln von Blockly können Sie Code mit der minimalen Anzahl von Klammern generieren, um für maximale Lesbarkeit zu sorgen.
„Richtige“ Ausgabe generieren
Wenn der generierte Code nicht für Menschen lesbar sein muss, müssen Sie sich keine Gedanken über die Minimierung von Klammern machen. Das Umschließen jedes Blocks ist ein guter Ansatz und sorgt dafür, dass der generierte Code immer korrekt ausgewertet wird.
Damit die Funktion korrekt funktioniert, müssen Sie Order.ATOMIC
immer an valueToCode
-Aufrufe übergeben und immer Order.NONE
von Ihrem Blockcodegenerator zurückgeben.
Optimale Klammern generieren
Klammern müssen nur eingefügt werden, wenn der generierte Code ohne sie falsch ist. Das passiert, wenn die Priorität eines Operators im äußeren Block höher ist als die Priorität eines Operators im inneren Block.
In den folgenden Blöcken gibt es beispielsweise einen unären Negationoperator und einen Additionsoperator. Die unäre Negation hat eine höhere Priorität als der Additionsoperator.
Wenn Sie also keine Klammern hinzufügen, erhalten Sie -5 + 2
und -
wird vor +
ausgewertet, was nicht den Blöcken entspricht.
Sie können dem Generator mitteilen, wann Klammern eingefügt werden sollen, indem Sie angeben, wie stark Ihre verschiedenen Operatoren sind. Wenn der äußere Operator stärker ist als der innere, werden Klammern eingefügt, um den inneren Operator zu schützen.
valueToCode
nimmt die Priorität des äußeren Operators an und das Rückgabetupel gibt die Priorität des inneren Operators an.
Hier ein Beispiel für einen Block mit zwei Operatoren:
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];
}
Vorrang von „valueToCode“
Wenn Sie valueToCode
aufrufen, um den Code eines inneren Blocks zu generieren, übergeben Sie ihm die Priorität des stärksten Operators, der auf den Code des inneren Blocks angewendet wird. Dies ist der Operator, vor dem der Code des inneren Blocks geschützt werden muss.
In den folgenden Blöcken wirken sich beispielsweise sowohl der unäre Negationoperator als auch der Additionsoperator auf den Code des inneren Blocks aus. Die unäre Negation ist stärker, daher sollten Sie diese Priorität an valueToCode
übergeben.
// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
Rückgabevorrang
Wenn Sie eine Priorität von Ihrem Blockcodegenerator zurückgeben, geben Sie die Priorität des schwächsten Operators im Code des Blocks zurück. Dies ist der Operator, der geschützt werden muss.
Der folgende Block enthält beispielsweise sowohl einen unären Negation- als auch einen Additionsoperator. Die Addition ist schwächer, daher sollte diese Priorität vom Blockcodegenerator zurückgegeben werden.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
Reihenfolge (enum)
Jedes Sprachgeneratormodul definiert ein Order
-Enum, das alle Vorrangregeln für diese Sprache enthält.
Stärkere Prioritäten haben niedrigere Werte, schwächere Prioritäten höhere Werte. Sie können sich starke Vorrangregeln als „höher“ und schwächere Vorrangregeln als „niedriger“ vorstellen, als wären sie Kämpfer in einem Wettbewerb.
Hier finden Sie die Order
-Enum-Typen für alle integrierten Sprachen:
Besondere Vorrangregeln
Die meisten Präzedenzstufen in den Order
-Enumerationen der Generatoren stimmen mit den Präzedenzstufen überein, die von den jeweiligen textbasierten Sprachen definiert wurden. Es gibt jedoch zwei spezielle Prioritäten: Order.ATOMIC
und Order.NONE
.
Order.ATOMIC
hat die höchste Priorität. Sie wird verwendet, wenn:
- Sie möchten dafür sorgen, dass Code immer in Klammern gesetzt wird, und übergeben ihn daher an
valueToCode
. - Da Ihr Block keine Operatoren enthält, geben Sie ihn über Ihren Block-Codegenerator zurück.
Order.NONE
hat die niedrigste Priorität. Sie wird verwendet, wenn:
- Sie möchten dafür sorgen, dass Code immer in Klammern steht, und geben ihn daher aus Ihrem Blockcode-Generator zurück.
- Da es keine Operatoren gibt, die auf einen inneren Block wirken, übergeben Sie ihn an
valueToCode
.