aboutsummaryrefslogtreecommitdiff
path: root/examples/listIdRe2.lua
diff options
context:
space:
mode:
authorSergio Queiroz <sqmedeiros@gmail.com>2016-06-28 16:00:31 -0300
committerSergio Queiroz <sqmedeiros@gmail.com>2016-06-28 16:00:31 -0300
commit6fd747b3061728245d4f7a0b5fc5baab18dac895 (patch)
tree1764d7817edd3740be17c9a7a96a871ccd082f6e /examples/listIdRe2.lua
parent2f18ef50aeb1acb15ec1bbed3ad03e758e2756c9 (diff)
downloadlpeglabel-6fd747b3061728245d4f7a0b5fc5baab18dac895.tar.gz
lpeglabel-6fd747b3061728245d4f7a0b5fc5baab18dac895.tar.bz2
lpeglabel-6fd747b3061728245d4f7a0b5fc5baab18dac895.zip
Updating the documentation and the examples
Diffstat (limited to 'examples/listIdRe2.lua')
-rw-r--r--examples/listIdRe2.lua49
1 files changed, 31 insertions, 18 deletions
diff --git a/examples/listIdRe2.lua b/examples/listIdRe2.lua
index 4cd140b..ccb7ce5 100644
--- a/examples/listIdRe2.lua
+++ b/examples/listIdRe2.lua
@@ -1,35 +1,48 @@
1local re = require 'relabel' 1local re = require 'relabel'
2 2
3local errUndef, errId, errComma = 0, 1, 2 3local errinfo = {
4 4 {"errUndef", "undefined"},
5local terror = { 5 {"errId", "expecting an identifier"},
6 [errUndef] = "Error", 6 {"errComma", "expecting ','"},
7 [errId] = "Error: expecting an identifier",
8 [errComma] = "Error: expecting ','",
9} 7}
10 8
11local tlabels = { ["errUndef"] = errUndef, 9local errmsgs = {}
12 ["errId"] = errId, 10local labels = {}
13 ["errComma"] = errComma } 11
12for i, err in ipairs(errinfo) do
13 errmsgs[i] = err[2]
14 labels[err[1]] = i
15end
16
17re.setlabels(labels)
18
19local function calcline (s, i)
20 if i == 1 then return 1, 1 end
21 local rest, line = s:sub(1,i):gsub("[^\n]*\n", "")
22 local col = #rest
23 return 1 + line, col ~= 0 and col or 1
24end
14 25
15re.setlabels(tlabels)
16 26
17local g = re.compile[[ 27local g = re.compile[[
18 S <- Id List 28 S <- Id List
19 List <- !. / (',' / %{errComma}) Id List 29 List <- !. / (',' / %{errComma}) (Id / %{errId}) List
20 Id <- [a-z] / %{errId} 30 Id <- Sp [a-z]+
31 Comma <- Sp ','
32 Sp <- %s*
21]] 33]]
22 34
23function mymatch (g, s) 35function mymatch (g, s)
24 local r, e, sfail = g:match(s) 36 local r, e, sfail = g:match(s)
25 if not r then 37 if not r then
26 return r, terror[e] .. " before '" .. sfail .. "'" 38 local line, col = calcline(s, #s - #sfail)
39 local msg = "Error at line " .. line .. " (col " .. col .. "): "
40 return r, msg .. errmsgs[e] .. " before '" .. sfail .. "'"
27 end 41 end
28 return r 42 return r
29end 43end
30
31print(mymatch(g, "a,b"))
32print(mymatch(g, "a b"))
33print(mymatch(g, ", b"))
34 44
45print(mymatch(g, "one,two"))
46print(mymatch(g, "one two"))
47print(mymatch(g, "one,\n two,\nthree,"))
35 48