かっこの挿入

ブロックはかっこを使用します。たとえば、次のブロックがある場合、 52 は以下の一部であるため、-5 + 2 ではなく -(5 + 2) を意味すると仮定します。 - は別のブロックの一部です。

-(5 + 2) を表すブロック

ただし、すべてのブロックを括弧で囲むと、コードが 読み取ります(((5) * (2)) + (3))5 * 2 + 3 を比較します。上記の両方 式は同じもの(13)に評価されますが、2 番目の式の方がはるかに簡単です あります。

Blockly の演算子の優先順位ルールを使用すると、最小限のリソースでコードを生成できます。 見やすくするために、括弧の個数を数えます。

「正しい」生成出力

生成されたコードを人が読める形式にする必要がない場合は、 かっこを最小限に抑えることができます。すべてのブロックをラップすることは 生成されたコードが常に正しく評価されます

正確性を保つため、常に Order.ATOMICvalueToCode 呼び出しに渡します。 ブロックコード生成ツールからは常に Order.NONE が返されます。

最適なかっこを生成する

括弧は、生成されたコードが正しくない場合にのみ挿入する必要があります。 できます。これは、外側のブロック内の演算子の優先順位が 内部ブロックの演算子の優先順位よりも強くなります。

たとえば、次のブロックには、単項否定演算子と 加算演算子です。単項否定は、否定演算子よりも 加算演算子です。

否定と加算

したがって、かっこを追加しないと -5 + 2 が得られ、- が評価されます。 これはブロックと一致しません。+ の前にある部分です。

かっこの強さを指定して、かっこを挿入するタイミングをジェネレータに伝えることができます。 異なります外部演算子の方がより強いことが判明した場合 内側の演算子よりも大きい場合は、内側の演算子を保護するためにかっこを挿入します。

valueToCode は外側の演算子よりも優先され、戻り値は タプルは内部演算子の優先順位を指定します。

次に、2 つの演算子を含むブロックの例を示します。

単項否定演算子、加算演算子、子要素を含むブロック
ブロックします。

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 の優先順位

valueToCode を呼び出して内部ブロックのコードを生成する場合は、 内部のコードで動作する最も強力な演算子の優先順位 ブロックします。これは、内側のブロックのコードを保護する必要がある演算子です。

たとえば、次のブロックでは、単項否定演算子と 内部ブロックのコードに作用しています。単項否定 より強力であるため、valueToCode に渡す必要がある優先度です。

単項否定演算子、加算演算子、子要素を含むブロック
ブロックします。

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

戻り値の優先順位

ブロックコード ジェネレータから優先順位を返す場合は、 ブロックのコード内での最も弱い演算子の優先順位。これが 保護が必要な通信事業者です。

たとえば、次のブロックには、単項否定演算子と 加算演算子です。追加はあまり難しくないので、優先度が高い方がよいでしょう。 ブロックコード生成ツールからの戻り値です。

単項否定演算子と加算演算子があり、子要素がないブロック
ブロック

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

Order 列挙型

すべての言語生成モジュールは、Order 列挙型を定義します。この列挙型には、 その言語の優先順位を付けます。

優先順位が高いほどバッキング値が低く、優先順位が弱いほど バッキング値を大きくします優先順位の高いものは 高め」弱い優先順位は「下位にランク付け」されますまるで彼らが 競争の激しい戦士でした。

すべての組み込み言語の Order 列挙型の場所は次のとおりです。

特別な優先順位

ジェネレータの優先順位のほとんどは、Order 個の列挙型が優先度と一致しています テキストベースの言語で定義されたものです。ただし、2 つの特別な 優先順位(Order.ATOMICOrder.NONE)があります。

Order.ATOMIC が最も優先順位です。次の場合に使用されます。

Order.NONE は最も弱い優先度です。次の場合に使用されます。