Klammern einfügen

Blöcke implizieren Klammern. Wenn Sie beispielsweise die folgenden Blöcke sehen, gehen Sie davon aus, dass dies -(5 + 2) und nicht -5 + 2 bedeutet, weil 5 und 2 Teil eines Blocks und - Teil eines anderen Blocks sind.

Blöcke, die -(5 + 2) darstellen

Wenn Sie jedoch jeden Block in Klammern setzen, wird der Code viel weniger lesbar. Vergleichen Sie „(((5) * (2)) + (3))“ mit „5 * 2 + 3“. Beide Ausdrücke ergeben dasselbe Ergebnis (13), aber der zweite Ausdruck ist viel einfacher zu lesen.

Die Rangfolgenregeln von Blockly helfen Ihnen, Code mit einer Mindestanzahl von Klammern zu generieren, um für maximale Lesbarkeit zu sorgen.

„Richtige“ Ausgabe generieren

Wenn Ihr generierter Code nicht für Menschen lesbar ist, müssen Sie die Klammern nicht minimieren. Das Zusammenfassen jedes 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 und geben Sie immer Order.NONE von Ihrem Blockcode-Generator zurück.

Optimale Klammern generieren

Klammern müssen nur dann eingefügt werden, wenn der generierte Code ohne sie falsch ist. Dies ist der Fall, wenn die Rangfolge eines Operators im äußeren Block höher ist als die eines Operators im inneren Block.

In den folgenden Blöcken gibt es beispielsweise einen unären Negationsoperator und einen Additionsoperator. Die unäre Negation hat eine höhere Priorität als der Additionsoperator.

Negieren und Addieren

Wenn Sie also keine Klammern hinzufügen, erhalten Sie -5 + 2 und - wird vor + ausgewertet, was nicht mit den Blöcken übereinstimmt.

Sie können dem Generator mitteilen, wann Klammern eingefügt werden sollen, indem Sie festlegen, wie stark die verschiedenen Operatoren sind. Wenn festgestellt wird, dass der äußere Operator stärker als der innere Operator ist, werden Klammern eingefügt, um den inneren Operator zu schützen.

valueToCode hat die Priorität des äußeren Operators und das Rückgabe-Tupel gibt die Priorität des inneren Operators an.

Hier ein Beispiel für einen Block mit zwei Operatoren:

Ein Block mit einem unären Negationsoperator, einem Additionsoperator und einem untergeordneten Block.

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];
}

„valueToCode“-Priorität

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 reagiert. Dies ist der Operator, vor dem der Code des inneren Blocks geschützt werden muss.

Im folgenden Block wirken sich sowohl der unäre Negationsoperator als auch der Additionsoperator auf den Code des inneren Blocks aus. Die unäre Negation ist stärker. Daher ist dies die Priorität, die Sie an valueToCode übergeben sollten.

Ein Block mit einem unären Negationsoperator, einem Additionsoperator und einem untergeordneten Block.

// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;

Rückgabepriorität

Wenn Sie eine Rangfolge von Ihrem Blockcode-Generator zurückgeben, geben Sie den Vorrang 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 Negationsoperator als auch einen Additionsoperator. Die Hinzufügung ist schwächer, daher ist dies die Priorität, die Sie vom Blockcode-Generator zurückgeben sollten.

Ein Block mit einem unären Negationsoperator und einem Additionsoperator und ohne untergeordneten Block

const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];

Auftragsnummer

Jedes Sprachgeneratormodul definiert ein Order-Enum, das alle Rangfolgen für diese Sprache enthält.

Stärkere Rangfolgen haben niedrigere Sicherungswerte und schwächere. Sie können sich starke Rangfolgen als "höher" in Stärke und schwächere Rang als "niedriger" vorstellen, als ob sie wettbewerbsorientierte Kämpfer wären.

Hier finden Sie die Order-Enums für alle integrierten Sprachen:

Besondere Rangfolgen

Die meisten Rangfolgen in den Order-Enums der Generatoren entsprechen den Prioritäten der jeweiligen textbasierten Sprachen. Es gibt jedoch zwei besondere Vorgänge: Order.ATOMIC und Order.NONE.

Order.ATOMIC hat die höchste Priorität. Er wird in folgenden Fällen verwendet:

Order.NONE ist die schwächste Rangfolge. Er wird in folgenden Fällen verwendet: