Klammern hinzufügen

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.

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

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.

Negation und Addition

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:

Ein Block mit einem unären Negationoperator, 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];
}

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.

Ein Block mit einem unären Negationoperator, 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ü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.

Ein Block mit einem unären Negationoperator, einem Additionsoperator und ohne untergeordneten Block

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:

Order.NONE hat die niedrigste Priorität. Sie wird verwendet, wenn: