2016-03-22 2 views
1

Я работаю над действительно простым интерпретатором для действительно простого языка программирования, и в настоящее время я пытаюсь вывести раздел кода для интерпретации, если условие будет выполнено. В настоящее время этот код, чтобы оценить между ключевыми словами compare и endcompare и что я хотел бы случиться следующее:Как создать таблицы 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

ОК, так что ... что ваш вопрос? –

+0

@ НикольБолас Я понял, что не очень точен в формулировке моего вопроса (и этим я имею в виду, что я этого не сделал) – user1610406

+0

У вас уже есть синтаксический анализатор для вашего «языка»? Он создает для вас таблицы типа 'original'? У вас есть код, который может «оценивать» таблицу «new» и понимать, что делать, когда видит запись 'compare'? (Как догадаться, какая таблица оценивается для 'compare'? –

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^