【问题标题】:How to create Lua tables automatically如何自动创建 Lua 表
【发布时间】:2016-07-08 18:36:30
【问题描述】:

我正在为一种非常简单的编程语言开发一个非常简单的解释器,并且我目前正在尝试提取一段代码来解释是否满足条件。目前,要评估的代码位于关键字 compareendcompare 之间,我希望发生的情况如下:

  • 从原始令牌列表中删除 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

到目前为止,我已经进行了几次尝试,但都没有成功,除非您计算反转部分表格或跳过所有其他标记...

我将如何创建该表?

【问题讨论】:

  • 好的,那么...你有什么问题?
  • @NicolBolas 我意识到我的问题措辞不是很准确(我的意思是我没有)
  • 您已经为您的这种“语言”提供了解析器?它目前为您创建像original 这样的表格?您有可以“评估”new 表并了解当它看到compare 条目时要做什么的代码? (它如何知道要为compare 评估哪个表?
  • @EtanReisner 它只是读取一个文件并用空格分隔关键字,然后根据关键字的内容执行操作,例如当它看到compare 时,它会执行我正在尝试的比较块拔出。就像我说的,我知道这个实现的局限性,我可能会改变它。
  • 这根本无法回答我的问题。

标签: arrays lua lua-table


【解决方案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

【讨论】:

  • continue 不是 Lua 中的关键字,但您可以使用 goto continue 并将 ::continue:: 放在循环的末尾。这也确实有效,但不会将continue 保留在原始文件中。不过,重新插入它不会太难。谢谢
猜你喜欢
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2021-10-05
  • 2021-01-13
  • 2011-10-07
相关资源
最近更新 更多