Blöcke bedeuten Klammern. Wenn Sie beispielsweise die folgenden Blöcke sehen,
Angenommen, es bedeutet -(5 + 2)
und nicht -5 + 2
, da 5
und 2
Teil von
und -
ist Teil eines anderen Blocks.
Aber wenn Sie jeden Block in Klammern setzen, wird der Code
lesbar sein. (((5) * (2)) + (3))
mit 5 * 2 + 3
vergleichen. Beides
Ausdrücke ergeben dasselbe Ergebnis (13
), aber die zweite Ausdrücke ist viel einfacher
zu lesen.
Mit den Rangfolgeregeln für Operatoren von Blockly können Sie Code mit minimalem Klammern zu setzen, um eine optimale Lesbarkeit zu erreichen.
„Richtig“ generieren Ausgabe
Wenn der generierte Code nicht menschenlesbar sein muss, Klammern zu minimieren. Das Umschließen eines Blocks ist ein guter Ansatz. und sorgt dafür, dass der generierte Code immer korrekt ausgewertet wird.
Übergeben Sie zur Gewährleistung der Richtigkeit immer Order.ATOMIC
an valueToCode
-Aufrufe.
geben Sie immer Order.NONE
von Ihrem Blockcode-Generator zurück.
Optimale Klammern generieren
Klammern müssen nur eingefügt werden, wenn der generierte Code ohne . Dies geschieht, wenn die Rangfolge eines Operators im äußeren Block höher als die Rangfolge eines Operators im inneren Block.
In den folgenden Blöcken gibt es beispielsweise einen unären Negationsoperator und einen Additionsoperatoren hinzufügen. Die unäre Negation hat eine stärkere Priorität als die Additionsoperatoren hinzufügen.
Wenn Sie also keine Klammern hinzufügen, erhalten Sie -5 + 2
und -
wird ausgewertet.
vor der +
, was nicht mit den Blocks übereinstimmt.
Sie können dem Generator mitteilen, wann Klammern eingefügt werden sollen, indem Sie festlegen, die verschiedenen Operatoren. Wenn festgestellt wird, dass der äußere Operator stärker ist, als beim inneren Operator, werden Klammern eingefügt, um den inneren Operator zu schützen.
valueToCode
hat Vorrang vor dem äußeren Operator und die Rückgabe
tuple gibt die Rangfolge des inneren Operators an.
Hier ist 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];
}
Rangfolge von valueToCode
Wenn Sie valueToCode
aufrufen, um den Code eines inneren Blocks zu generieren, übergeben Sie ihn
den Vorrang des stärksten Operators, der auf den Code des inneren
blockieren. Dies ist der Operator, vor dem der Code des inneren Blocks geschützt werden muss.
Im folgenden Beispiel werden sowohl der unäre Negationsoperator als auch der
auf den Code des inneren Blocks angewendet. Die unäre Negation
ist stärker. Das ist die Rangfolge, die Sie an valueToCode
übergeben sollten.
// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;
Rangfolge bei Rückgaben
Wenn Sie von Ihrem Blockcode-Generator eine Rangfolge zurückgeben, wird der Parameter Vorrang vor dem schwächsten Operator im Code des Blocks. Dies ist die die geschützt werden muss.
Der folgende Block enthält beispielsweise sowohl einen unären Negationsoperator als auch einen Additionsoperatoren hinzufügen. Die Ergänzung ist schwächer. Das ist die Rangfolge, die Sie vom Blockcode-Generator zurückgegeben.
const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];
Order enum
Jedes Sprachgeneratormodul definiert ein Order
-Enum, das alle
die Rangfolge für diese Sprache.
Stärkere Vorrangstufen haben niedrigere Backup-Werte, schwächere Vorrangstufen haben höhere Back-up-Werte. Starke Rangfolgen werden als höher“ stärker und schwächere Vorrangstufen als „niedriger eingestuft“ als ob sie waren Konkurrenzkämpfer.
Hier finden Sie die Order
-Enums für alle integrierten Sprachen:
Besondere Vorrangstufen
Die meisten Vorrangstufen in den Order
Enums entsprechen den Rangfolgen
die jeweils durch ihre textbasierten Sprachen definiert sind. Es gibt jedoch zwei besondere
Order.ATOMIC
und Order.NONE
.
Order.ATOMIC
hat die höchste Priorität. Sie wird in folgenden Fällen verwendet:
- Achten Sie darauf, dass der Code immer in Klammern gesetzt ist,
Sie übergeben es also an
valueToCode
. - Ihr Block enthält keine Operatoren, Sie geben ihn daher über die Blockcode-Generator zu erstellen.
Order.NONE
hat die schwächste Priorität. Sie wird in folgenden Fällen verwendet:
- Achten Sie darauf, dass der Code immer in Klammern gesetzt ist, Sie geben ihn von Ihrem Blockcode-Generator zurück.
- Es gibt keine Operatoren, die auf einen inneren Block angewendet werden.
valueToCode