aboutsummaryrefslogtreecommitdiff
path: root/examples/typedlua/tllexer.lua
diff options
context:
space:
mode:
Diffstat (limited to 'examples/typedlua/tllexer.lua')
-rw-r--r--examples/typedlua/tllexer.lua80
1 files changed, 80 insertions, 0 deletions
diff --git a/examples/typedlua/tllexer.lua b/examples/typedlua/tllexer.lua
new file mode 100644
index 0000000..bcfa802
--- /dev/null
+++ b/examples/typedlua/tllexer.lua
@@ -0,0 +1,80 @@
1local tllexer = {}
2
3local lpeg = require "lpeglabel"
4lpeg.locale(lpeg)
5
6local function setffp (s, i, t)
7 if not t.ffp or i > t.ffp then
8 t.ffp = i
9 end
10 return false
11end
12
13local function updateffp ()
14 return lpeg.Cmt(lpeg.Carg(1), setffp)
15end
16
17tllexer.Shebang = lpeg.P("#") * (lpeg.P(1) - lpeg.P("\n"))^0 * lpeg.P("\n")
18
19local Space = lpeg.space^1
20
21local Equals = lpeg.P("=")^0
22local Open = "[" * lpeg.Cg(Equals, "init") * "[" * lpeg.P("\n")^-1
23local Close = "]" * lpeg.C(Equals) * "]"
24local CloseEQ = lpeg.Cmt(Close * lpeg.Cb("init"),
25 function (s, i, a, b) return a == b end)
26
27local LongString = Open * (lpeg.P(1) - CloseEQ)^0 * Close /
28 function (s, o) return s end
29
30local Comment = lpeg.P("--") * LongString /
31 function () return end +
32 lpeg.P("--") * (lpeg.P(1) - lpeg.P("\n"))^0
33
34tllexer.Skip = (Space + Comment)^0
35
36local idStart = lpeg.alpha + lpeg.P("_")
37local idRest = lpeg.alnum + lpeg.P("_")
38
39local Keywords = lpeg.P("and") + "break" + "do" + "elseif" + "else" + "end" +
40 "false" + "for" + "function" + "goto" + "if" + "in" +
41 "local" + "nil" + "not" + "or" + "repeat" + "return" +
42 "then" + "true" + "until" + "while"
43
44tllexer.Reserved = Keywords * -idRest
45
46local Identifier = idStart * idRest^0
47
48tllexer.Name = -tllexer.Reserved * Identifier * -idRest
49
50function tllexer.token (pat)
51 return pat * tllexer.Skip + updateffp() * lpeg.P(false)
52end
53
54function tllexer.symb (str)
55 return tllexer.token(lpeg.P(str))
56end
57
58function tllexer.kw (str)
59 return tllexer.token(lpeg.P(str) * -idRest)
60end
61
62local Hex = (lpeg.P("0x") + lpeg.P("0X")) * lpeg.xdigit^1
63local Expo = lpeg.S("eE") * lpeg.S("+-")^-1 * lpeg.digit^1
64local Float = (((lpeg.digit^1 * lpeg.P(".") * lpeg.digit^0) +
65 (lpeg.P(".") * lpeg.digit^1)) * Expo^-1) +
66 (lpeg.digit^1 * Expo)
67local Int = lpeg.digit^1
68
69tllexer.Number = Hex + Float + Int
70
71local ShortString = lpeg.P('"') *
72 ((lpeg.P('\\') * lpeg.P(1)) + (lpeg.P(1) - lpeg.P('"')))^0 *
73 lpeg.P('"') +
74 lpeg.P("'") *
75 ((lpeg.P("\\") * lpeg.P(1)) + (lpeg.P(1) - lpeg.P("'")))^0 *
76 lpeg.P("'")
77
78tllexer.String = LongString + ShortString
79
80return tllexer