blockly > CodeGenerator

CodeGenerator 類別

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

Signature:

export declare class CodeGenerator 

建構函式

建構函式 修飾符 說明
(建構函式)(名稱) 建構 CodeGenerator 類別的新執行個體

屬性

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

區塊產生器函式的字典,索引鍵,索引鍵為區塊。每個區塊產生器函式都使用兩個參數:

- 用來產生程式碼的區塊,以及呼叫 CodeGenerator (或子類別) 執行個體的程式碼,讓函式可以呼叫以下定義的方法 (例如 blockToCode) 或相關子類別 (例如 JavascripGenerator),

然後傳回:

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

FUNCTION_NAME_PLACEHOLDER_ 字串 這會當做 CodeGenerator.provideFunction_ 定義的函式中的預留位置。不得在函式定義 (或註解) 中正常顯示法律程式碼,也不得混淆規則運算式剖析器。
FUNCTION_NAME_PLACEHOLDER_REGEXP_ RegExp
functionNames_ protected { [key: string]: 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 字串 | 空值 要在每個陳述式之前插入的任意程式碼。陳述式的所有區塊 ID 都會取代「%1」的執行個體。例如:highlight(%1);\n
STATEMENT_SUFFIX 字串 | 空值 要在每個陳述式後方插入的任意程式碼。陳述式的所有區塊 ID 都會取代「%1」的執行個體。例如:highlight(%1);\n

方法

方法 修飾符 說明
addLoopTrap(branch, block) 在迴圈內容中加入無限迴圈陷阱。在迴圈區塊的開頭加入陳述式後置字串 (緊接在迴圈陳述式執行後),並在迴圈區塊的結尾 (緊接在迴圈陳述式執行前)。
addReservedWords(words) 將一或多個字詞新增至這個語言的保留字詞清單。
allNestedComments(block) 以遞迴方式自動尋檢樹,並傳回他們所有的評論。
blockToCode(block, opt_thisOnly) 為指定區塊 (和附加區塊) 產生程式碼。產生器必須先初始化,才能呼叫這個函式。
finish(代碼) 產生程式碼所需的掛鉤,以便在程式碼產生結束時執行。子類別可能會覆寫這項設定,例如在產生的程式碼前面加上匯入陳述式或變數定義。
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)

定義要包含在產生的程式碼中,由開發人員定義的函式 (而非使用者定義的程序)。用於建立私人輔助函式。第一次使用指定的想要名稱呼叫這個程式碼時,系統會儲存程式碼並產生實際名稱。使用 same needName 的後續呼叫不會產生任何作用,但傳回的值會相同。

呼叫端會自行確認不同的輔助函式並未使用相同的想要名稱 (例如使用「colourRandom」和「listRandom」,而非「random」)。這種狀況不會造成與保留字詞衝突,或使用者定義的變數或程序名稱衝突。

呼叫 CodeGenerator.finish() 時,就會輸出程式碼。

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