-
Notifications
You must be signed in to change notification settings - Fork 0
/
leg-ometa.lua
62 lines (56 loc) · 1.82 KB
/
leg-ometa.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
(patt:p arrow action:e)
-> do
local parts = { p.text, " * (" }
local cbs = {}
for _, name in ipairs(p.names) do
cbs[#cbs+1] = "lpeg.Cb('" .. name .. "')"
end
parts[#parts+1] = table.concat(cbs, " * ")
parts[#parts+1] = ") / function ("
parts[#parts+1] = table.concat(names, ", ")
parts[#parts+1] = ") " .. e .. " end"
return table.concat(parts)
end
(namedpatt:p ':' name)
-> do
return "lpeg.Cg(" .. p.text
end
leg = grammar ()
token(t) = _ t _,
not = token('!'),
and = token('&'),
lpar = token('('),
rpar = token(')'),
star = token('*'),
plus = token('+'),
opt = token('?'),
bind = token(':'),
equal = token('='),
slash = token('/'),
popen = token('?('),
arrow = token('->'),
marrow = token('=>'),
do = token('do'),
tend = token('end'),
lbra = token('{'),
rbra = token('}'),
openg = token('grammar'),
parms = lpar listof(name) rpar,
ablock = do block tend / lbra tbody rbra,
action = arrow ablock / marrow ablock,
arg = rulename / fullpatt,
args = lpar listof(arg) rpar,
ruleapp = rulename args?,
prefixpatt = lpar fullpatt rpar / not prefixpatt / and prefixpatt / string / ruleapp,
simplepatt = prefixpatt (star / plus / opt)?,
namedpatt = simplepatt bind name
actionpatt = (namedpatt / simplepatt / predicate)+ action,
predicate = popen exp rpar,
rule = name equal fullpatt,
seqpatt = (actionpatt / simplepatt)+,
fullpatt = seqpatt (slash seqpatt)*,
grammar = openg parms listof(rule) tend
end
p = (lpeg.Cg(lpeg.C(lpeg.P("foo")),"foo") * lpeg.Cg(lpeg.P"bar","bar") *
lpeg.Cmt(lpeg.Cb"bar" * lpeg.Cb"foo", function (s, i, ...) print(...) return true end) *
((lpeg.Cb"bar" * lpeg.Cb"foo") / function (...) print(...) return "x" end)) / function (...) print(...) end