括号插入

分块表示的是括号。例如,当您看到以下代码块时, 并假定它意味着 -(5 + 2),而不是 -5 + 2,因为 52 是 一个块,而 - 是另一个块的一部分。

表示 -(5 + 2) 的块

但是,如果用圆括号括住每个代码块,代码会大大减少 可读性。将 (((5) * (2)) + (3))5 * 2 + 3 进行比较。以上两者皆可 表达式的计算结果相同 (13),但第二个表达式要简单得多 。

Blockly 的运算符优先规则可帮助您生成 括号数,以提高可读性。

生成“正确”输出

如果不要求生成的代码直观易懂,则无需 来关注最小化括号。封装每一个代码块是一种很好的方法, 它可确保始终正确评估您生成的代码。

为确保正确性,请务必将 Order.ATOMIC 传递给 valueToCode 调用,以及 始终从块码生成器返回 Order.NONE

生成最优括号

只有在生成的代码不正确时才需插入括号, 。如果外部代码块中运算符的优先级是 比内部块中运算符的优先级强。

例如,在以下代码块中,有一个一元否定运算符和一个 加法运算符。一元否定的优先级高于 加法运算符。

否定和加法

因此,如果不添加圆括号,则会得到 -5 + 2,并且系统会对 - 进行求值 在 + 之前,这与块不匹配。

您可以告诉生成器在什么情况下插入括号,只需告诉生成器插入多大的 不同的运算符如果发现外部运算符 它会插入括号以保护内部运算符。

valueToCode 优先于外部运算符,而 return 元组指定内部运算符的优先级。

以下是包含两个运算符的块示例:

具有一元否定运算符、加法运算符和子运算符的块
。

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.ATOMICOrder.NONE

Order.ATOMIC 是最高优先级。适用于以下情况:

Order.NONE 是最低优先级。适用于以下情况: