Blockly 代碼生成器的引入

生成代碼

大多數(shù)塊的應(yīng)用程序都需要將塊變成代碼來執(zhí)行。這個頁面描述了如何將代碼生成器添加到自定義塊中枫慷。

首先,進入generators/目錄并選擇與您想要生成的語言(JavaScript器虾,Python捞高,PHP,Lua甸私,Dart等)相對應(yīng)的子目錄诚些。假設(shè)您的塊不適合現(xiàn)有的類別,請創(chuàng)建一個新的JavaScript文件皇型。這個新的JavaScript文件需要包含在<script>編輯器HTML文件中的標簽列表中诬烹。編輯器HTML文件中的標簽列表中。編輯器HTML文件中的標簽列表中弃鸦。編輯器HTML文件中的標簽列表中绞吁。

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

此圖為官方的一個例子,特指text_indexOf塊兒

收集參數(shù)

任何塊的代碼生成器的第一個任務(wù)是收集所有參數(shù)和字段數(shù)據(jù)。有幾項常用于此任務(wù)的功能:

getFieldValue? ? ?valueToCode? ? ?statementToCode

getFieldValue

圖2

該函數(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)用:

圖3

該函數(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

圖4

該函數(shù)查找連接到指定語句輸入的嵌套塊的堆棧秉犹,為該堆棧生成代碼蛉谜,縮進代碼并以字符串形式返回代碼。如果輸入未連接崇堵,則此函數(shù)返回一個空字符串型诚。

請注意,JavaScript應(yīng)改為相應(yīng)的語言(Python鸳劳,PHP狰贯,Lua,Dart,等)涵紊。

組裝代碼

一旦收集完所有參數(shù)傍妒,就可以組裝最終代碼。對于大多數(shù)街區(qū)而言摸柄,這是直接的颤练。這是一個while循環(huán)的例子:

圖5

語句塊(那些沒有返回值的塊)可以毫不費力地返回代碼:

圖6

值塊(返回值的塊)稍微復雜一些。下面是一個基本的算術(shù)運算符(加號塘幅,減號等)的例子:

圖7

這個例子說明了操作順序問題昔案。考慮形成表達式的兩個連接的算術(shù)塊的情況(2 * (3 + 4))电媳。使用上面的代碼剪切踏揣,加法塊將返回字符串,"3 + 4"?而乘法塊將使用此作為輸入返回"2 * 3 + 4"匾乓。這個結(jié)果是不正確的捞稿,因為執(zhí)行時3會更緊密地綁定到乘法。

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

圖8

每個語言生成器都有一個有序的優(yōu)先級列表娱局。返回的訂單值指定將代碼綁定在一起的最小力。有關(guān)詳細信息咧七,請參閱運營商優(yōu)先級頁面衰齐。

如果生成的代碼要求包含子塊的代碼兩次,則應(yīng)該緩存參數(shù)以提高效率并防止副作用.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末继阻,一起剝皮案震驚了整個濱河市耻涛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘟檩,老刑警劉巖抹缕,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異墨辛,居然都是意外死亡卓研,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門睹簇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奏赘,“玉大人,你說我怎么就攤上這事太惠≈菊洌” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵垛叨,是天一觀的道長。 經(jīng)常有香客問我,道長嗽元,這世上最難降的妖魔是什么敛纲? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮剂癌,結(jié)果婚禮上淤翔,老公的妹妹穿的比我還像新娘。我一直安慰自己佩谷,他們只是感情好旁壮,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谐檀,像睡著了一般抡谐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桐猬,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天麦撵,我揣著相機與錄音,去河邊找鬼溃肪。 笑死免胃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惫撰。 我是一名探鬼主播羔沙,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼厨钻!你這毒婦竟也來了扼雏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤莉撇,失蹤者是張志新(化名)和其女友劉穎呢蛤,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棍郎,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡其障,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涂佃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片励翼。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辜荠,靈堂內(nèi)的尸體忽然破棺而出汽抚,到底是詐尸還是另有隱情,我是刑警寧澤伯病,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布造烁,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惭蟋。R本人自食惡果不足惜苗桂,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望告组。 院中可真熱鬧煤伟,春花似錦、人聲如沸木缝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽我碟。三九已至放案,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怎囚,已是汗流浹背卿叽。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恳守,地道東北人考婴。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像催烘,于是被迫代替她去往敵國和親沥阱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348