創(chuàng)建自定義塊 - 生成代碼


title: 創(chuàng)建自定義塊 - 生成代碼

Create Custom BlocksGenerating Code

原文鏈接:https://developers.google.com/blockly/guides/create-custom-blocks/generating-code

大多數Blockly應用程序需要將塊轉換為代碼以供執(zhí)行。本頁介紹如何向自定義塊添加代碼生成器。

首先饿序,轉到generators /目錄并選擇與要生成的語言(JavaScript熬荆,Python共屈,PHP晒奕,Lua煮寡,Dart等)對應的子目錄妆毕。假設您的塊不適合現有類別,請創(chuàng)建一個新的JavaScript文件痹届。這個新的JavaScript文件需要包含在編輯器的HTML文件中的<script ...>標簽列表中呻待。

典型的塊的代碼生成器如下所示

Blockly.JavaScript['text_indexOf'] = function(block) {
  // Search the text for a substring.
  var operator = block.getFieldValue('END') == 'FIRST' ? 'indexOf' : 'lastIndexOf';
  var subString = Blockly.JavaScript.valueToCode(block, 'FIND',
      Blockly.JavaScript.ORDER_NONE) || '\'\'';
  var text = Blockly.JavaScript.valueToCode(block, 'VALUE',
      Blockly.JavaScript.ORDER_MEMBER) || '\'\'';
  var code = text + '.' + operator + '(' + subString + ')';
  return [code, Blockly.JavaScript.ORDER_MEMBER];
};

收集參數


任何塊的代碼生成器的第一個任務是收集所有的參數和字段數據。這個任務通常有幾個函數:

getFieldValue

block.getFieldValue('END')

此函數從指定名稱的字段返回值队腐。

  • 在文本字段的情況下带污,此函數返回鍵入的文本。例如香到。 “Hello World”鱼冀。
  • 在下拉列表的情況下,此函數返回與所選選項相關聯(lián)的與語言無關的文本悠就。英語塊可能有一個下拉菜單千绪,選擇了“first”,而德語中的下拉菜單將顯示“erste”梗脾。代碼生成器不必知道所有可能的人類語言荸型,因此getFieldValue函數將返回創(chuàng)建下拉列表時指定的語言中性文本(Blockly的核心塊通常使用大寫英語單詞,例如“FIRST”)炸茧。
  • 在變量下拉的情況下瑞妇,此函數返回變量下拉的面向用戶的名稱稿静。請注意,此名稱不一定與生成的代碼中使用的變量名稱相同辕狰。例如改备,變量名“for”在Blockly中是合法的,但是在大多數語言中將與保留字沖突蔓倍,因此將被重命名為“for2”悬钳。同樣,阿拉伯語變量名“?????”在Blockly中是合法的偶翅,但在大多數語言中是非法的默勾,因此將被重命名為“_D9_85_D8_AA_D8_BA_D9_8A_D8_B1”。要獲取Blockly變量名稱為可用于生成代碼的變量名稱聚谁,請使用以下調用:
Blockly.JavaScript.variableDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);

請注意母剥,JavaScript應該更改為適當的語言(Python,PHP形导,Lua媳搪,Dart等),因為每種語言都有不同的保留字列表骤宣。

valueToCode

Blockly.JavaScript.valueToCode(block, 'FROM', Blockly.JavaScript.ORDER_ADDITION) || '0'

此函數查找連接到命名值輸入(“FROM”)的塊,生成該塊的代碼序愚,并將該代碼作為字符串返回憔披。如果輸入未連接,則此函數返回null爸吮,這就是為什么通常使用布爾值“或”和默認值跟隨函數的原因芬膝。因此,在上面的示例中形娇,如果沒有塊附加到名為“FROM”的輸入锰霜,則此輸入的默認代碼將為字符串'0'。

第三個參數指定嵌入所需的操作信息的順序桐早。每個語言生成器都有一個有序的優(yōu)先級列表癣缅。 valueToCode函數需要傳遞對應于將應用于返回的代碼的最大力的順序值。這允許valueToCode根據需要將代碼括在括號中哄酝。有關詳細信息友存,請參閱運營商優(yōu)先級頁面operator precedence

請注意陶衅,JavaScript應該更改為適當的語言(Python屡立,PHP,Lua搀军,Dart等)膨俐。

statementToCode

Blockly.JavaScript.statementToCode(block, 'DO')

此函數查找連接到指定語句輸入的嵌套塊的堆棧勇皇,生成該堆棧的代碼,縮進代碼焚刺,并將代碼作為字符串返回敛摘。如果輸入未連接,則此函數返回一個空字符串檩坚。
請注意着撩,JavaScript應該更改為適當的語言(Python,PHP匾委,Lua拖叙,Dart等)。

組裝代碼


一旦收集了所有參數赂乐,就可以組合最終的代碼薯鳍。這對于大多數塊是直接的。這里是一個while循環(huán)的例子

var code = 'while (' + argument0 + ') {\n' + branch0 + '}\n';

語句塊(不返回值的那些塊)然后可以返回代碼挨措,而不用費心:

return code;

值塊(返回值的那些塊)有點復雜挖滤。這里是一個基本算術運算符(加號,減號等)的例子:

var code = argument0 + ' ' + operator + ' ' + argument1;

此示例說明了操作順序問題浅役≌端桑考慮形成表達式(2 *(3 + 4))的兩個連接的算術塊的情況。使用上述代碼剪切觉既,加法塊將返回字符串“3 + 4”惧盹,而乘法塊將使用其作為輸入以返回“2 * 3 + 4”。這個結果是不正確的瞪讼,因為執(zhí)行時3將更緊密地綁定到乘法钧椰。

為了解決這個問題,值塊必須返回一個包含兩個值的列表:代碼和適當的順序值:

return [code, Blockly.JavaScript.ORDER_ADDITION];

每個語言生成器都有一個有序的優(yōu)先級列表符欠。返回的順序值指定將代碼綁定在一起的最小強制嫡霞。有關詳細信息,請參閱運營商優(yōu)先級頁面operator precedence希柿。

如果生成的代碼要求子塊的代碼被包括兩次诊沪,則應該緩存參數cache the arguments以提高效率并防止副作用。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末曾撤,一起剝皮案震驚了整個濱河市娄徊,隨后出現的幾起案子,更是在濱河造成了極大的恐慌盾戴,老刑警劉巖寄锐,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡橄仆,警方通過查閱死者的電腦和手機剩膘,發(fā)現死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盆顾,“玉大人怠褐,你說我怎么就攤上這事∧埽” “怎么了奈懒?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宪巨。 經常有香客問我磷杏,道長,這世上最難降的妖魔是什么捏卓? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任极祸,我火速辦了婚禮,結果婚禮上怠晴,老公的妹妹穿的比我還像新娘遥金。我一直安慰自己,他們只是感情好蒜田,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布稿械。 她就那樣靜靜地躺著,像睡著了一般冲粤。 火紅的嫁衣襯著肌膚如雪美莫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天色解,我揣著相機與錄音,去河邊找鬼餐茵。 笑死科阎,一個胖子當著我的面吹牛,可吹牛的內容都是我干的忿族。 我是一名探鬼主播锣笨,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼道批!你這毒婦竟也來了错英?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤隆豹,失蹤者是張志新(化名)和其女友劉穎椭岩,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡判哥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年献雅,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塌计。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡挺身,死狀恐怖,靈堂內的尸體忽然破棺而出锌仅,到底是詐尸還是另有隱情章钾,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布热芹,位于F島的核電站贱傀,受9級特大地震影響,放射性物質發(fā)生泄漏剿吻。R本人自食惡果不足惜窍箍,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丽旅。 院中可真熱鬧椰棘,春花似錦、人聲如沸榄笙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茅撞。三九已至帆卓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間米丘,已是汗流浹背剑令。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拄查,地道東北人吁津。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像堕扶,于是被迫代替她去往敵國和親碍脏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)稍算,也就是一...
    悟名先生閱讀 4,131評論 0 13
  • title: 創(chuàng)建自定義塊 - 定義塊 Create Custom Blocks - Define Blocks ...
    mimimomo閱讀 5,740評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理典尾,服務發(fā)現,斷路器糊探,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 把第三方程序打包在assembly里钾埂, 運行時釋放并調用河闰, 兩種方法 使用resx文件 創(chuàng)建一個resx文件,如M...
    Raven7閱讀 273評論 0 0
  • Docker是基于鏡像的勃教。鏡像類似于已經包含了文件淤击、配置和安裝好的程序的虛擬機鏡像。同樣的故源,你可以像啟動虛擬機一樣...
    wangliang938閱讀 396評論 0 0