gpt4 book ai didi

lua - 每个匹配的 LPeg 增量

转载 作者:行者123 更新时间:2023-12-04 04:37:17 26 4
gpt4 key购买 nike

我正在为 Lua 制作一个序列化库,我正在使用 LPeg 来解析字符串。我已经使用了 K/V 对(使用明确命名的键),但现在我要添加自动索引。

它会像这样工作:

@"value"
@"value2"

将评估为
{
[1] = "value"
[2] = "value2"
}

我已经让值匹配工作了(字符串、表格、数字和 bool 值都可以完美地工作),所以我不需要帮助;我正在寻找的是索引。对于@[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 = require 'lpeg'
l = lpeg.locale(lpeg)


whitesp = l.space ^ 0
bool_val = (l.P "true" + "false") / function (s) return s == "true" end
num_val = l.digit ^ 1 / tonumber
string_val = '"' * l.C(l.alnum ^ 1) * '"'
val = bool_val + num_val + string_val
at_notation = l.Ct( (l.P "@" * whitesp * val * whitesp) ^ 0 )

local testdata = [[
@"value1"
@42
@ "value2"
@true
]]

local res = l.match(at_notation, testdata)

匹配返回一个包含以下内容的表:
{
[1] = "value1",
[2] = 42,
[3] = "value2",
[4] = true
}

关于lua - 每个匹配的 LPeg 增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19541065/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com