首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每场比赛的LPeg增量

每场比赛的LPeg增量
EN

Stack Overflow用户
提问于 2013-10-23 11:59:35
回答 1查看 392关注 0票数 2

我正在为Lua创建一个序列化库,并使用LPeg解析字符串。我已经让K/V对工作(键被显式命名),但是现在我要添加自动索引。

它的工作方式如下:

代码语言:javascript
复制
@"value"
@"value2"

将评估到

代码语言:javascript
复制
{
  [1] = "value"
  [2] = "value2"
}

我已经让值匹配工作(字符串、表、数字和布尔都能很好地工作),所以我不需要帮助;我正在寻找的是索引。对于@value模式的每一次匹配,它都应该捕获找到的@value模式的数量--换句话说,我可以匹配一个值序列(“@value1”@"value2"),但我不知道如何根据匹配的数量为它们分配索引。如果不够清楚,只需注释,我将尝试更好地解释它。

下面是我当前的模式(使用压缩表示法):

代码语言:javascript
复制
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]

正如您在最后一行代码中所看到的,我有一个函数执行以下操作:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-23 23:18:19

根据您到目前为止所描述的内容,您应该能够使用简单的捕获和表捕获来完成这一任务。

下面是我提出的一个简化的示例来说明:

代码语言:javascript
复制
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)

匹配返回包含以下内容的表:

代码语言:javascript
复制
{
  [1] = "value1",
  [2] = 42,
  [3] = "value2",
  [4] = true
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19541065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档