LPeg增量为每次匹配
2013-10-23 15:29:24
收藏:0
阅读:128
评论:1
我正在为 Lua 制作一份序列化库,使用 LPeg 解析字符串。我已经让键/值对正常工作(键名已经显式命名),接下来我要添加自动索引。
它的工作方式如下:
@"value"
@"value2"
会被转换为
{
[1] = "value"
[2] = "value2"
}
我已经让值匹配正常工作(字符串、表、数字和布尔型都完美地工作),因此我不需要关于它的帮助;我正在寻找的是索引。对于每个 @[value pattern] 匹配,它应该捕获到找到的 @[value pattern] 的数量 - 换句话说,我可以匹配一系列的值(“@”值1“@”值2)但我不知道如何根据匹配的数量分配它们的索引。如果这不够清楚,请在评论中提出,我会尝试更好地解释它。
这是我的当前模式的一部分(使用压缩标记):
local process = {} -- 将捕获的值进行处理
process.number = tonumber
process.string = function(s) return s:sub(2, -2) end -- 剥离开头和结尾的标记
process.boolean = function(s) if s == "true" then return true else return false end
number = [十进制、科学计数法的数字] / process.number
string = [双引号或单引号字符串,支持转义引号字符] / process.string
boolean = P("true") + "false" / process.boolean
table = [平衡括号] / [解析表]
type = number + string + boolean + table
at_notation = (P("@") * whitespace * type) / [创建一个包含键和值的表]
如你所见,在代码的最后一行,我已经有了一个函数:
k,v 匹配模式
-- 变成 --
{k, v}
-- 然后将其添加到“条目表”中(我循环遍历它并将其添加到返回的表中)
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
基于你所描述的,你应该能够使用简单捕获和表格捕获来完成此任务。
以下是我编写的简化示例:
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 }