生成代碼
大多數(shù)塊的應(yīng)用程序都需要將塊變成代碼來執(zhí)行。這個頁面描述了如何將代碼生成器添加到自定義塊中枫慷。
首先,進入generators/目錄并選擇與您想要生成的語言(JavaScript器虾,Python捞高,PHP,Lua甸私,Dart等)相對應(yīng)的子目錄诚些。假設(shè)您的塊不適合現(xiàn)有的類別,請創(chuàng)建一個新的JavaScript文件皇型。這個新的JavaScript文件需要包含在<script>編輯器HTML文件中的標簽列表中诬烹。編輯器HTML文件中的標簽列表中。編輯器HTML文件中的標簽列表中弃鸦。編輯器HTML文件中的標簽列表中绞吁。
典型的塊代碼生成器如下所示:
收集參數(shù)
任何塊的代碼生成器的第一個任務(wù)是收集所有參數(shù)和字段數(shù)據(jù)。有幾項常用于此任務(wù)的功能:
getFieldValue? ? ?valueToCode? ? ?statementToCode
getFieldValue
該函數(shù)從指定名稱的字段返回值唬格。
在文本字段的情況下家破,該函數(shù)返回鍵入的文本。例如“Hello World”购岗。
在下拉的情況下汰聋,該函數(shù)返回與所選選項關(guān)聯(lián)的與語言無關(guān)的文本。一個英文單詞可能會有一個下拉字藕畔,選擇“first”一詞马僻,而德語中的同一個下拉菜單則會顯示“erste”。代碼生成器不必知道所有可能的人類語言注服,因此該getFieldValue函數(shù)將返回創(chuàng)建下拉列表時指定的語言中性文本(Blockly的核心塊通常使用大寫英文單詞,例如“FIRST”)措近。
在變量下拉的情況下溶弟,該函數(shù)返回變量下拉的面向用戶的名稱。請注意瞭郑,這個名稱不一定與生成的代碼中使用的變量名稱相同辜御。例如,“?forBlockly?”中的變量名稱在Blockly中是合法的屈张,但會在大多數(shù)語言中與保留字發(fā)生沖突擒权,因此將被重命名為“?for2”袱巨。同樣,?????“Blockly”中的阿拉伯語變量名稱在Blockly中是合法的碳抄,但在大多數(shù)語言中都是非法的愉老,因此會重命名為“?_D9_85_D8_AA_D8_BA_D9_8A_D8_B1”。要獲取可用于生成的代碼的Blockly變量名稱剖效,請使用以下調(diào)用:
該函數(shù)查找連接到命名值輸入('FROM')的塊嫉入,生成該塊的代碼,并將該代碼作為字符串返回璧尸。在輸入未連接的情況下咒林,此函數(shù)返回null,這就是為什么通常使用布爾型“or”和默認值跟隨函數(shù)的原因爷光。因此垫竞,在上面的示例中,如果沒有任何塊連接到名為'FROM'的輸入蛀序,那么此輸入的默認代碼將是字符串'0'欢瞪。
第三個參數(shù)指定嵌入所需的操作信息的順序。每個語言生成器都有一個有序的優(yōu)先級列表哼拔。該?valueToCode函數(shù)需要傳遞與將應(yīng)用于返回代碼的最大力相對應(yīng)的訂單值引有。valueToCode如果需要,這允許?將代碼包裝在括號中倦逐。有關(guān)詳細信息譬正,請參閱運營商優(yōu)先級頁面。
請注意檬姥,JavaScript應(yīng)改為相應(yīng)的語言(Python曾我,PHP,Lua健民,Dart抒巢,等)。
statementToCode
該函數(shù)查找連接到指定語句輸入的嵌套塊的堆棧秉犹,為該堆棧生成代碼蛉谜,縮進代碼并以字符串形式返回代碼。如果輸入未連接崇堵,則此函數(shù)返回一個空字符串型诚。
請注意,JavaScript應(yīng)改為相應(yīng)的語言(Python鸳劳,PHP狰贯,Lua,Dart,等)涵紊。
組裝代碼
一旦收集完所有參數(shù)傍妒,就可以組裝最終代碼。對于大多數(shù)街區(qū)而言摸柄,這是直接的颤练。這是一個while循環(huán)的例子:
語句塊(那些沒有返回值的塊)可以毫不費力地返回代碼:
值塊(返回值的塊)稍微復雜一些。下面是一個基本的算術(shù)運算符(加號塘幅,減號等)的例子:
這個例子說明了操作順序問題昔案。考慮形成表達式的兩個連接的算術(shù)塊的情況(2 * (3 + 4))电媳。使用上面的代碼剪切踏揣,加法塊將返回字符串,"3 + 4"?而乘法塊將使用此作為輸入返回"2 * 3 + 4"匾乓。這個結(jié)果是不正確的捞稿,因為執(zhí)行時3會更緊密地綁定到乘法。
為了解決這個問題拼缝,值塊必須返回一個包含兩個值的列表:代碼和合適的順序值:
每個語言生成器都有一個有序的優(yōu)先級列表娱局。返回的訂單值指定將代碼綁定在一起的最小力。有關(guān)詳細信息咧七,請參閱運營商優(yōu)先級頁面衰齐。
如果生成的代碼要求包含子塊的代碼兩次,則應(yīng)該緩存參數(shù)以提高效率并防止副作用.