blockly > CodeGenerator

CodeGenerator 类

用于将代码块转换为语言的代码生成器的类。

Signature:

export declare class CodeGenerator 

构造函数

构造函数 修饰符 说明
(constructor)(name) 构造 CodeGenerator 类的新实例

属性

媒体资源 修饰符 类型 说明
COMMENT_WRAP number 封装前注释的最大长度。不考虑缩进级别。
definitions_ protected { [键: 字符串]: 字符串; } 要在代码前面输出的定义的字典。
forBlock Record<string, (block: Block, generator: this) => [string, number] | string | null>

块生成器函数的字典,按块类型进行键控。每个块生成器函数都需要两个参数:

- 为 和 - 调用 CodeGenerator(或子类)实例生成代码的块,以便该函数可以调用下面定义的方法(例如 blockToCode)或对相关子类(例如 JavascripGenerator)进行调用;

并返回:

- [代码, 优先级] 元组(针对值/表达式块)或者 - 包含生成的代码的字符串(针对语句块),或者 - 如果不应针对块发出任何代码,则返回 null。

FUNCTION_NAME_PLACEHOLDER_ string 它在使用 CodeGenerator.provideFunction_ 定义的函数中用作占位符。不得是可以合法出现在函数定义(或注释)中的法律代码,并且不得混淆正则表达式解析器。
FUNCTION_NAME_PLACEHOLDER_REGEXP_ RegExp
functionNames_ protected { [键: 字符串]: 字符串; } 将定义_中所需的函数名称映射到实际函数名称的字典(以避免与用户函数冲突)。
缩进 string 缩进方法。默认为两个空格,但语言生成器可能会覆盖此设置,以增加缩进量或改为制表符。
INFINITE_LOOP_TRAP 字符串 | null 注入到可能造成无限循环的位置的任意代码。“%1”的所有实例都会被替换成失败的块 ID。例如 checkTimeout(%1);\n
isInitialized boolean | null 是否已调用 init 方法。如果生成器在创建后设为 false 并在 init 中将它设置为 true,则会导致 blockToCode 在生成器尚未初始化时发出警告。如若不更改,该标志将不会产生任何影响。
name_ string
nameDB_? 姓名 (可选)包含变量和过程名称的数据库。
ORDER_OVERRIDES 数字 [][] 不需要括号的外层对的列表。
RESERVED_WORDS_ protected string 以英文逗号分隔的保留字列表。
STATEMENT_PREFIX 字符串 | null 在每个语句之前注入的任意代码。“%1”的所有实例都将被替换为语句的块 ID。例如 highlight(%1);\n
STATEMENT_SUFFIX 字符串 | null 在每个语句后注入的任意代码。“%1”的所有实例都将被替换为语句的块 ID。例如 highlight(%1);\n

方法

方法 修饰符 说明
addLoopTrap(branch, block) 向循环的内容添加无限循环陷阱。在循环块的开头(即执行循环语句之后)添加语句后缀,并在循环块的末尾(即执行循环语句之前)添加语句前缀。
addReservedWords(words) 将一个或多个字词添加到该语言的保留字词列表中。
allNestedComments(block) 以递归方式“爬取”代码块树,返回其所有注释。
blockToCode(block, opt_thisOnly) 为指定的代码块(以及附加的代码块)生成代码。必须在调用此函数之前初始化生成器。
finish(代码) 钩子在代码生成结束时运行代码。子类可以覆盖此属性,例如,在生成的代码前面加上 import 语句或变量定义。
getProcedureName(name) 获取用户定义的过程的唯一法定名称。在调用此方法之前,该类的 nameDB_ 属性必须已初始化。这通常在代码生成器类的 init 函数中完成。
getVariableName(nameOrId) 获取用户定义的变量的唯一法定名称。在调用此方法之前,该类的 nameDB_ 属性必须已初始化。这通常在代码生成器类的 init 函数中完成。
init(_workspace) 钩子在代码生成开始之前运行代码。子类可以覆盖此属性,例如为了初始化变量名称数据库。
injectId(msg, block) 在消息中注入块 ID 以替换“%1”。用于 STATEMENT_PREFIX、STATEMENT_SUFFIX 和 INFINITE_LOOP_TRAP。
prefixLines(text, prefix) 请在每行代码前附加一个通用前缀。用于缩进代码或添加注释标记。
provideFunction_(desiredName, 代码)

定义要包含在生成的代码中的开发者定义的函数(而非用户定义的过程)。用于创建私有辅助函数。第一次使用指定的 requiredName 调用此方法时,系统会保存代码并生成实际名称。具有相同 requiredName 的后续调用不会有任何作用,但具有相同的返回值。

调用方应确保不同的辅助函数中未使用相同的 requiredName(例如,使用“colourRandom”和“listRandom”,而非“random”)。不存在与保留字、用户定义的变量或过程名称冲突的风险。

调用 CodeGenerator.finish() 时,系统会输出该代码。

scrub_(_block, code, _opt_thisOnly) protected 根据代码块生成代码的常见任务。此方法从 blockToCode 调用,并对每个代码块(而不仅仅是顶级代码块)进行调用。子类可以覆盖此属性,例如,为位于代码块之后的语句生成代码,或为指定代码块及任何连接的值代码块处理注释。
scrubNakedValue(line) 裸值是具有输出未插入任何内容的顶级块。子类可以覆盖此属性,例如,如果子类的语言不允许使用裸值,就会出现这种情况。
statementToCode(block, name) 生成一个代码字符串,表示附加到指定语句输入的块。缩进代码。主要用于生成器。尝试生成代码以进行评估时,请使用 workspaceToCode 或 blockToCode 查看。
valueToCode(block, name, outerOrder) 生成表示指定值输入的代码。
workspaceToCode(workspace) 为工作区中的所有代码块生成指定语言的代码。