我试图使用lpeg lua解析器将字符串'a?(b?c:d):e'
转换为另一个字符串'ifthenelse(a,ifthenelse(b,c,d),e)'
。我正在慢慢学习如何使用lpeg,但仍无法找到合适的解决方案来实现捕获。有任何想法吗?用lpeg转换(cond,then,else)到ifthnel(cond,then,else)
这是我到目前为止所做的。
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,P,R,...,V),后来我意识到,这种做法实际上使语法规则更容易阅读! – Stomp 2012-12-06 13:24:17