ブロックはかっこを使用します。たとえば、次のブロックがある場合、
5
と 2
は以下の一部であるため、-5 + 2
ではなく -(5 + 2)
を意味すると仮定します。
-
は別のブロックの一部です。
ただし、すべてのブロックを括弧で囲むと、コードが
読み取ります(((5) * (2)) + (3))
と 5 * 2 + 3
を比較します。上記の両方
式は同じもの(13
)に評価されますが、2 番目の式の方がはるかに簡単です
あります。
Blockly の演算子の優先順位ルールを使用すると、最小限のリソースでコードを生成できます。 見やすくするために、括弧の個数を数えます。
「正しい」生成出力
生成されたコードを人が読める形式にする必要がない場合は、 かっこを最小限に抑えることができます。すべてのブロックをラップすることは 生成されたコードが常に正しく評価されます
正確性を保つため、常に Order.ATOMIC
を valueToCode
呼び出しに渡します。
ブロックコード生成ツールからは常に 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.ATOMIC
と Order.NONE
)があります。
Order.ATOMIC
が最も優先順位です。次の場合に使用されます。
- コードは常に括弧で囲まれているようにしたい場合、
valueToCode
に渡します。 - ブロックに演算子が含まれていないため、 ブロックコード ジェネレータ。
Order.NONE
は最も弱い優先度です。次の場合に使用されます。
- コードは常に括弧で囲まれているようにしたい場合、 ブロックコード生成ツールから返します。
- 内側のブロックで作用する演算子がないため、
valueToCode
。