分块表示的是括号。例如,当您看到以下代码块时,
并假定它意味着 -(5 + 2)
,而不是 -5 + 2
,因为 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.ATOMIC
和 Order.NONE
。
Order.ATOMIC
是最高优先级。适用于以下情况:
- 您需要确保代码始终括在圆括号中,
因此请将其传递给
valueToCode
。 - 您的块不包含任何运算符,因此您需要从 块代码生成器。
Order.NONE
是最低优先级。适用于以下情况:
- 您需要确保代码始终括在圆括号中, 因此你可从区块码生成器返回此代码。
- 内部块没有操作符,因此您需要将其传递给
valueToCode
。