lua - 使用 lpeg 进行变换(cond ? then : else) to ifthenelse(cond, then,else)

标签 lua lpeg

我正在尝试将 'a?(b?c:d):e' 这样的字符串转换为另一个字符串 'ifthenelse(a,ifthenelse(b,c,d) ),e)' 使用lpeg lua解析器。我正在慢慢学习如何使用 lpeg,但仍然找不到合适的解决方案来进行捕获。有什么想法吗?

这是我到目前为止所做的。

local lpeg = require("lpeg")

local S, P, R = lpeg.S, lpeg.P, lpeg.R
local C, Cc, Ct = lpeg.C, lpeg.Cc, lpeg.Ct
local Cf, Cg, Cs = lpeg.Cf, lpeg.Cg, lpeg.Cs
local V = lpeg.V

local thenop = P("?")
local elseop = P(":")
local openpar = P("(")
local closepar = P(")")
local digit = R("09")
local letter = R("az") + R("AZ")

local parser = 
   P({
    "F",
    F = V("E") * (thenop * V("E") * elseop * V("E"))^0,
    E = (letter + digit)^1 + (openpar * V("F") * closepar)
 }) -- * -1 -- Is it needed?
print(lpeg.match(parser,"a?(b?c:d):e"))
print(lpeg.match(parser,"a"))

最佳答案

我稍微改变了语法,但我认为仍然是一样的:

S = E "?" E ":" E | E
E = "(" S ")" | T
T = (L | D) +
L = [a-z] | [A-Z]
D = [0-9]

没有捕获的语法:

local grammar = lpeg.P{
  "S";
  S = (lpeg.V"E" * lpeg.P"?" * lpeg.V"E" * lpeg.P":" * lpeg.V"E") + lpeg.V"E",
  E = (lpeg.P"(" * lpeg.V"S" * lpeg.P")") + lpeg.V"T",
  T = (lpeg.V"L" + lpeg.V"D")^1,
  L = lpeg.R("az") + lpeg.R("AZ"),
  D = lpeg.R("09")
}

捕获的语法:

local grammar2 = lpeg.P{
  "S";
  S = (lpeg.Cs(lpeg.V"E") / "ifthenelse(%1") * (lpeg.P"?" / ",") * lpeg.V"E" * (lpeg.P":" / ",") * (lpeg.Cs(lpeg.V"E") / "%1)") + lpeg.V"E",
  E = (lpeg.P"(" / "") * lpeg.V"S" * (lpeg.P")" / "") + lpeg.V"T",
  T = (lpeg.V"L" + lpeg.V"D")^1,
  L = lpeg.R("az") + lpeg.R("AZ"),
  D = lpeg.R("09")
}

捕获替换:

  • “(”和“)”带有空字符串( lpeg.P"(" / ""lpeg.P")" / "") )
  • 第一个变量与“ifthenelse(variable”(lpeg.Cs(lpeg.V"E") / "ifthenelse(%1"))匹配
  • “?”和“:”与“,”( lpeg.P"?" / ","lpeg.P":" / "," )
  • 最后一个变量与“variable)”匹配 ( lpeg.Cs(lpeg.V"E") / "%1)" )

一些随机测试(在评论中输出):

print( lpeg.match( lpeg.Cs(grammar2), "a") )
-- a
print( lpeg.match( lpeg.Cs(grammar2), "a?b:c") )
-- ifthenelse(a,b,c)
print( lpeg.match( lpeg.Cs(grammar2), "a?(i?j:k):c") )
-- ifthenelse(a,ifthenelse(i,j,k),c)
print( lpeg.match( lpeg.Cs(grammar2), "(a?(i?j:(x?y:z)):b)?c:(u?v:w)") )
-- ifthenelse(ifthenelse(a,ifthenelse(i,j,ifthenelse(x,y,z)),b),c,ifthenelse(u,v,w))

我希望您能从这里继续。

关于lua - 使用 lpeg 进行变换(cond ? then : else) to ifthenelse(cond, then,else),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9330477/

相关文章:

lua - 调试 aerospike lua UDF

regex - 匹配 Lua 模式中的可选数字

lua - Lpeg "empty loop in rule"错误

lua - 匹配没有连续连字符的字符串的 LPeg 模式

lua - 使用 LPeg 使 Lua 模式不区分大小写

lua - require'd 函数的参数在 Lua 中丢失/消失了吗?

c++ - 将 C++ 对象传递给 Lua 函数

java - LuaJava 和最新的 LuaBinaries

serialization - lua表序列化的方法

lua - 在 Windows 上通过 luarocks 安装 Moonscript