首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于解析可能包含内部组的逗号分隔组的lpeg语法

用于解析可能包含内部组的逗号分隔组的lpeg语法
EN

Stack Overflow用户
提问于 2012-05-14 02:13:52
回答 1查看 201关注 0票数 0

我需要解析逗号分隔的组(括在括号中),这些组中可能有内部组。它应该只分隔外部组。

我有一个函数可以做到这一点:

代码语言:javascript
复制
function lpeg.commaSplit(arg)
    local P,C,V,sep = lpeg.P, lpeg.C, lpeg.V, lpeg.P(",")
    local p = P{
        "S";
        S = lpeg.T_WSpace * C(V"Element") * (lpeg.T_WSpace * sep * lpeg.T_WSpace * C(V"Element"))^0 * lpeg.T_WSpace,
        Element = (V"Group")^0 * (1 - lpeg.T_Group - sep)^0 * (V"Group" * (1 - lpeg.T_Group - sep)^0)^0 * (1 - sep)^0,
        Group = lpeg.T_LGroup * ((1 - lpeg.T_Group) + V"Group")^0 * lpeg.T_RGroup
    }^-1
    return lpeg.match(lpeg.Ct(p), arg)

end

但问题是要删除可能包含在组中的额外括号。

下面是一个测试字符串:

代码语言:javascript
复制
[[a,b,[c,d]],[e,[f,g]]]

应解析为

代码语言:javascript
复制
[a,b,[c,d] & [e,[f,g]]

请注意,内部组保持不变。简单地删除末尾的额外括号是行不通的,因为您最终会得到一个像a,b,[c,d]],[e,[f,g]这样的字符串。

你知道如何修改lpeg语法来支持外部组吗?

EN

回答 1

Stack Overflow用户

发布于 2012-05-29 01:00:00

因为我不擅长用LPeg编写语法,所以我觉得做这个练习很有趣……

我不能设法使用你的语法,所以我做了我自己的语法,用更小的块更容易理解,我可以把我需要的捕获放在哪里。

我想我得到了一个不错的经验结果。它适用于你的测试用例,我不知道组是否可以嵌套得更深,等等。捕获的后处理有点特别……

代码语言:javascript
复制
require"lpeg"

-- Guesswork...
lpeg.T_WSpace = lpeg.P" "^0
lpeg.T_LGroup = lpeg.P"["
lpeg.T_RGroup = lpeg.P"]"
lpeg.T_Group = lpeg.S"[]"

function lpeg.commaSplit(arg)
  local P, C, Ct, V, sep = lpeg.P, lpeg.C, lpeg.Ct, lpeg.V, lpeg.P","
  local grammar =
  {
    "S";
    S = lpeg.T_WSpace * V"Group" * lpeg.T_WSpace,
    Group = Ct(lpeg.T_LGroup * C(V"Units") * lpeg.T_RGroup),
    Units = V"Unit" *
        (lpeg.T_WSpace * sep * lpeg.T_WSpace * V"Unit")^0,
    Unit = V"Element" + V"Group",
    Element = (1 - sep - lpeg.T_Group)^1,
  }
  return lpeg.match(Ct(P(grammar)^-1), arg)
end

local test = "[[a,b,[c,d]],[e,[f,g]]]"
local res = lpeg.commaSplit(test)
print(dumpObject(res))
print(res[1], res[1][1], res[1][2])
local groups = res[1]
local finalResult = {}
for n, v in ipairs(groups) do
  if type(v) == 'table' then
    finalResult[#finalResult+1] = "[" .. v[1] .. "]"
  end
end
print(dumpObject(finalResult))

dumpObject只是我自己的一个表转储。此代码的输出如下:

代码语言:javascript
复制
local T =
{
  {
    "[a,b,[c,d]],[e,[f,g]]",
    {
      "a,b,[c,d]",
      {
        "c,d"
      }
    },
    {
      "e,[f,g]",
      {
        "f,g"
      }
    }
  }
}

table: 0037ED48 [a,b,[c,d]],[e,[f,g]]   table: 0037ED70

local T =
{
  "[a,b,[c,d]]",
  "[e,[f,g]]"
}

就我个人而言,我不会用我的东西弄脏lpeg桌子,但我在这里保留了你的风格。

我希望这将是有用的(或将是一个起点,使您的进步)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10574067

复制
相关文章

相似问题

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