gpt4 book ai didi

lua - 如何让 LPeg.match 返回 nil

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

我目前正在熟悉 LPeg 解析器模块。为此,我想将版本字符串(例如 11.4)与 list 进行匹配。

这样的列表是一个具有严格语法的字符串,也可以包含范围。这是一个类似 EBNF,但无论如何都非常简单的语法(我把它写下来是因为下面的 LPeg 代码可能有点难以阅读):

S = R, { ',', R }
R = N, [ '-', N ]
N = digit+, [ '.', digit+ ]

示例字符串为 1-9,10.1-11,12。这是我的巨大代码:

local L = require "lpeg"
local LV, LP, LC, LR, floor = L.V, L.P, L.C, L.R, math.floor
local version = "7.25"

local function check(a, op, b)
if op and a+0 <= version and version <= b+0 then
return a..op..b -- range
elseif not op and floor(version) == floor(a+0) then
return a -- single item
end
end
local grammar = LP({ "S",
S = LV"R" * (LP"," * LV"R")^0,
R = LV"V" * (LC(LP"-") * LV"V")^-1 / check,
V = LC(LV"D" * (LP"." * LV"D")^-1),
D = (LR("09")^1),
})
function checkversion(str)
return grammar:match(str)
end

因此您可以像 checkversion("1-7,8.1,8.3,9") 那样调用它,如果当前版本与列表不匹配,您应该得到 nil

现在,问题是,如果对 check 的所有调用都没有返回任何内容(意思是,如果版本不匹配),grammar:match(...) 将实际上没有捕获,因此返回字符串的当前位置。但这正是我想要的,我希望checkversion 返回nilfalse 如果没有match 和其他计算结果为 true 的东西,实际上就像 string:match 会做的。

另一方面,如果我在不匹配的情况下从 check 返回 falsenil,我最终得到返回值from match like nil, "1", nil, nil 这基本上是无法处理的。

有什么想法吗?

最佳答案

我认为你可以通过不断捕获 nil 或 + 它:

grammar = grammar + lpeg.Cc(nil)

关于lua - 如何让 LPeg.match 返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18793493/

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