2016-03-22 36 views
1

我正在爲一種非常簡單的編程語言開發一個非常簡單的解釋器,並且我正在嘗試提取一段代碼來解釋條件是否滿足。目前,該代碼是要評估的關鍵字compareendcompare什麼,我想發生之間如下:如何自動創建Lua表

  • 從令牌的原始列表後可達endcompare刪除一切,保持compare在該列表中。
  • 將刪除的標記放入另一個表中,在原始表中找到compare時,這個表不包括endcompare

基本上:

original = {"a", "b", "c", "compare", "this", "please", "whatever", "endcompare", "d"} 

這個 「魔力」 功能後,產生如下:

new = {"a", "b", "c", "compare", "d"} 
c = {"this", "please", "whatever"} 

在這種情況下,new將被評估,並且遇到該關鍵字compare時,評估c並返回到new

我到目前爲止已經有一些嘗試和沒有一個是成功的,除非你扭轉了表的一部分或跳過所有其他標記...

我將如何去創造說桌子嗎?

+0

OK,所以...什麼是你的問題嗎? –

+0

@NicolBolas我意識到我在表達我的問題時並不十分精確(我的意思是我沒有) – user1610406

+0

你已經有了解析器來適應你的這種「語言」嗎?它現在爲你創建像'original'這樣的表嗎?你有能夠「評估」新表的代碼,並理解什麼時候它看到「比較」條目? (如何知道要比較的表是什麼表格? –

回答

1

我認爲這會做你要找的東西,但我沒有測試它:

function produceTwo(original) 
local newT, c, go = {}, {}, false 
for i,v in ipairs(original) do 
    if v == "compare" then 
    go = true 
    continue 
    elseif v == "endcompare" then 
    go = false 
    continue 
    end 

    if go then 
    table.insert(c, v) 
    else 
    table.insert(newT, v) 
    end 
end 
return newT, c 
end 
+0

'continue'不是關鍵字Lua,但是你可以使用'goto continue'並在循環結束時加入':: continue ::'。這也行,但是不能保留原來的'continue',它不會太難重新插入它,謝謝 – user1610406