Я немного изменил грамматику, но все же думаю:
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))
Я надеюсь, что вы можете продолжить отсюда.