blockly > CodeGenerator

CodeGenerator 類別

用於將區塊翻譯成語言的程式碼產生器類別。

Signature:

export declare class CodeGenerator 

建構函式

建構函式 修飾符 說明
(建構函式)(名稱) 建構 CodeGenerator 類別的新例項

屬性

屬性 修飾符 類型 說明
COMMENT_WRAP 號碼 註解在換行前的長度上限。不考慮縮排層級。
definitions_ protected { [鍵:字串]: string; } 要在程式碼之前輸出的定義字典。
forBlock Record<string, (block: Block, generator: this) => [string, number] | string | null>

區塊產生器函式的字典,按照區塊類型設定索引鍵。每個區塊產生器函式都使用兩個參數:

- 產生程式碼的方塊;呼叫 - 呼叫 CodeGenerator (或子類別),讓函式可以呼叫以下定義的方法 (例如 blockToCode) 或相關子類別 (例如 JavascripGenerator),

以及傳回:

- [code,優先] 元組 (用於值/運算式區塊) 或 - 包含產生程式碼的字串 (用於陳述式區塊);如果沒有對區塊發出程式碼,則為空值。

FUNCTION_NAME_PLACEHOLDER_ 字串 這會做為使用 CodeGenerator.provideFunction_ 定義的函式中的預留位置。不得為函式定義 (或註解) 中的合法代碼,而且不得混淆規則運算式剖析器。
FUNCTION_NAME_PLACEHOLDER_REGEXP_ RegExp
functionNames_ protected { [鍵:字串]: string; } 可在定義中將所需函式名稱對應至實際函式名稱的字典 (以避免使用者函式發生衝突)。
產業 字串 縮排方法。預設值為兩個空格,但語言產生器可能會覆寫這項設定,增加縮排或變更為定位點。
INFINITE_LOOP_TRAP 字串 | 空值 用於注入風險位置的任意程式碼。所有「%1」的執行個體都會替換為失敗的區塊 ID。例如: checkTimeout(%1);\n
isInitialized boolean | null 指出是否已呼叫 init 方法。如果產生器是在建立後將這個標記設為 false,且在 init 中設為 true,則在產生器尚未初始化時, blockToCode 會發出警告。如果未變更此標記,將不會有任何作用。
name_ 字串
nameDB_? 名稱 (選用) 含有變數和程序名稱的資料庫。
ORDER_OVERRIDES 數字 [][] 「不」需要括號的內外部配對清單。
RESERVED_WORDS_ protected 字串 以半形逗號分隔的保留字詞清單。
STATEMENT_PREFIX 字串 | 空值 在每個陳述式前插入的任意程式碼。所有「%1」的執行個體都會替換為陳述式的區塊 ID。例如:highlight(%1);\n
STATEMENT_SUFFIX 字串 | 空值 在每個陳述式後插入的任意程式碼。所有「%1」的執行個體都會替換為陳述式的區塊 ID。例如:highlight(%1);\n

方法

方法 修飾符 說明
addLoopTrap(branch, block) 在迴圈的內容中新增無限迴圈。在迴圈區塊的開頭新增陳述式後置字串 (在迴圈陳述式執行後立即),並在迴圈區塊執行之前 (位於迴圈陳述式執行前) 加上陳述式前置字元。
addReservedWords(words) 將一或多個字詞加入這個語言的保留字詞清單中。
allNestedComments(block) 以遞迴方式植入方塊樹狀結構,並傳回所有註解。
blockToCode(block, opt_thisOnly) 為指定區塊 (和附加的區塊) 產生程式碼。產生器必須先初始化,才能呼叫這個函式。
finish(code) 讓程式碼在程式碼產生結束時執行。子類別可能會覆寫這項設定,例如在產生的程式碼前面加上匯入陳述式或變數定義。
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, code)

定義要在產生的程式碼中加入的開發人員定義函式 (非使用者定義的程序)。用於建立私人輔助函式。初次使用特定 Name 呼叫這個執行個體時,系統會儲存該程式碼並產生實際名稱。後續呼叫具有相同期望 Name 的效果不會有任何效果,但傳回值相同。

呼叫端可自行確保不同的輔助函式沒有使用相同的 needName (例如:使用「colourRandom」和「listRandom」,而非「random」)。與保留字詞、使用者定義的變數或程序名稱之間不會有衝突。

呼叫 CodeGenerator.finish() 時,程式碼會取得輸出內容。

scrub_(_block, code, _opt_thisOnly) 從區塊產生程式碼的常見工作。這會透過 blockToCode 呼叫,並在每個區塊中呼叫,而不只是頂層區塊。子類別可能會覆寫這項設定,例如為區塊之後的陳述式產生程式碼,或是處理指定區塊和任何連結值區塊的註解。
scrubNakedValue(line) Naked 值是頂層區塊,其中的輸出內容沒有插入任何項目。子類別可能會覆寫這個值,例如語言不允許使用裸名值。
statementToCode(block, name) 產生程式碼字串,代表附加至已命名陳述式輸入內容的區塊。為程式碼縮排。這主要用於產生器中。如要嘗試產生程式碼來評估使用 workspaceToCode 或 blockToCode,
valueToCode(block, name, outerOrder) 產生代表輸入指定值的程式碼。
workspaceToCode(workspace) 為工作區中的所有區塊以指定語言產生程式碼。