【发布时间】:2013-11-01 16:37:19
【问题描述】:
我正在为 Lua 创建一个序列化库,并且我正在使用 LPeg 来解析字符串。我已经让 K/V 对工作(使用明确命名的键),但现在我要添加自动索引。
它会像这样工作:
@"value"
@"value2"
将评估为
{
[1] = "value"
[2] = "value2"
}
我已经让值匹配工作(字符串、表格、数字和布尔值都可以正常工作),所以我不需要帮助;我正在寻找的是索引。对于@[value pattern] 的每个匹配项,它应该捕获找到的@[value pattern] 的数量 - 换句话说,我可以匹配一系列值(“@”value1“@”value2”)但我不'不知道如何根据匹配数为它们分配索引。如果还不够清楚,请发表评论,我会尝试更好地解释它。
这是我当前模式的样子(使用压缩符号):
local process = {} -- Process a captured value
process.number = tonumber
process.string = function(s) return s:sub(2, -2) end -- Strip of opening and closing tags
process.boolean = function(s) if s == "true" then return true else return false end
number = [decimal number, scientific notation] / process.number
string = [double or single quoted string, supports escaped quotation characters] / process.string
boolean = P("true") + "false" / process.boolean
table = [balanced brackets] / [parse the table]
type = number + string + boolean + table
at_notation = (P("@") * whitespace * type) / [creates a table that includes the key and value]
正如你在最后一行代码中看到的,我有一个函数可以做到这一点:
k,v matched in the pattern
-- turns into --
{k, v}
-- which is then added into an "entry table" (I loop through it and add it into the return table)
【问题讨论】:
-
好吧,这不是一个 LPeg 特定的想法,但你不能循环匹配并使用
t[#t+1]=matched_value吗?这甚至适用于简单的 Lua 模式匹配。 -
以上一条评论为例:
p=function(s)local t={} for m in s:gmatch('@([^@]*)') do t[#t+1]=loadstring('return '..m)()end return t end。可能需要一些清理才能获得正确的沙盒和 5.2 兼容性,但您明白了。作为示例用法:p('@"blah" @1 @print @function(x)return x*2 end')任何不是 @ 的东西都是值。 -
不清楚您在寻找什么。上面的索引不是已经表明了捕获的数量吗?
-
感谢您的建议 :) 您知道在 LPeg 中明确执行此操作的方法吗?使用
Ct([matches])是最简单的,对它们进行计数并插入它们,但在 LPeg 中执行它会更快、更“漂亮”。 -
抱歉,没有看到@greatwolf 的帖子。