diff options
| author | Sergio Queiroz <sqmedeiros@gmail.com> | 2017-07-06 11:41:14 -0300 |
|---|---|---|
| committer | Sergio Queiroz <sqmedeiros@gmail.com> | 2017-07-06 11:41:14 -0300 |
| commit | 976b38458e0bba58ca748e96b53afd9ee74a1d1d (patch) | |
| tree | 55f910858b7573b90e6491a3d88a66b56d5d4db7 | |
| parent | 8ee42c29131e1c7de48575d6d8a9b24ea6977cbd (diff) | |
| download | lpeglabel-976b38458e0bba58ca748e96b53afd9ee74a1d1d.tar.gz lpeglabel-976b38458e0bba58ca748e96b53afd9ee74a1d1d.tar.bz2 lpeglabel-976b38458e0bba58ca748e96b53afd9ee74a1d1d.zip | |
Fixing the documentation of setlabels and an example of error recovery
| -rw-r--r-- | README.md | 71 |
1 files changed, 32 insertions, 39 deletions
| @@ -108,8 +108,8 @@ Returns line and column information regarding position <i>i</i> of the subject. | |||
| 108 | #### <a name="re-setl"></a><code>relabel.setlabels (tlabel)</code> | 108 | #### <a name="re-setl"></a><code>relabel.setlabels (tlabel)</code> |
| 109 | 109 | ||
| 110 | Allows to specicify a table with labels. They keys of | 110 | Allows to specicify a table with labels. They keys of |
| 111 | `tlabel` must be integers between 1 and 255, | 111 | `tlabel` must be strings and the associated values must |
| 112 | and the associated values should be strings. | 112 | be integers between 1 and 255. |
| 113 | 113 | ||
| 114 | 114 | ||
| 115 | ### Examples | 115 | ### Examples |
| @@ -279,7 +279,7 @@ local g = m.P{ | |||
| 279 | "S", | 279 | "S", |
| 280 | S = m.V"Id" * m.V"List", | 280 | S = m.V"Id" * m.V"List", |
| 281 | List = -m.P(1) + m.V"Comma" * m.V"Id" * m.V"List", | 281 | List = -m.P(1) + m.V"Comma" * m.V"Id" * m.V"List", |
| 282 | Id = m.V"Sp" * id + m.T(errId), | 282 | Id = m.V"Sp" * m.C(id) + m.T(errId), |
| 283 | Comma = m.V"Sp" * "," + m.T(errComma), | 283 | Comma = m.V"Sp" * "," + m.T(errComma), |
| 284 | Sp = m.S" \n\t"^0, | 284 | Sp = m.S" \n\t"^0, |
| 285 | } | 285 | } |
| @@ -287,64 +287,57 @@ local g = m.P{ | |||
| 287 | local subject, errors | 287 | local subject, errors |
| 288 | 288 | ||
| 289 | function recorderror(pos, lab) | 289 | function recorderror(pos, lab) |
| 290 | local line, col = re.calcline(subject, pos) | 290 | local line, col = re.calcline(subject, pos) |
| 291 | table.insert(errors, { line = line, col = col, msg = terror[lab] }) | 291 | table.insert(errors, { line = line, col = col, msg = terror[lab] }) |
| 292 | end | 292 | end |
| 293 | 293 | ||
| 294 | function record (lab) | 294 | function record (lab) |
| 295 | return (m.Cp() * m.Cc(lab)) / recorderror | 295 | return (m.Cp() * m.Cc(lab)) / recorderror |
| 296 | end | 296 | end |
| 297 | 297 | ||
| 298 | function sync (p) | 298 | function sync (p) |
| 299 | return (-p * m.P(1))^0 | 299 | return (-p * m.P(1))^0 |
| 300 | end | ||
| 301 | |||
| 302 | function defaultValue () | ||
| 303 | return m.Cc"NONE" | ||
| 300 | end | 304 | end |
| 301 | 305 | ||
| 302 | local grec = m.P{ | 306 | local grec = m.P{ |
| 303 | "S", | 307 | "S", |
| 304 | S = m.Rec(m.Rec(g, m.V"ErrComma", errComma), m.V"ErrId", errId), | 308 | S = m.Rec(m.Rec(g, m.V"ErrComma", errComma), m.V"ErrId", errId), |
| 305 | ErrComma = record(errComma) * sync(id), | 309 | ErrComma = record(errComma) * sync(id), |
| 306 | ErrId = record(errId) * sync(m.P",") | 310 | ErrId = record(errId) * sync(m.P",") * defaultValue(), |
| 307 | } | 311 | } |
| 308 | 312 | ||
| 309 | 313 | ||
| 310 | function mymatch (g, s) | 314 | function mymatch (g, s) |
| 311 | errors = {} | 315 | errors = {} |
| 312 | subject = s | 316 | subject = s |
| 313 | local r, e, sfail = g:match(s) | 317 | io.write("Input: ", s, "\n") |
| 314 | if #errors > 0 then | 318 | local r = { g:match(s) } |
| 315 | local out = {} | 319 | io.write("Captures (separated by ';'): ") |
| 320 | for k, v in pairs(r) do | ||
| 321 | io.write(v .. "; ") | ||
| 322 | end | ||
| 323 | io.write("\nSyntactic errors found: " .. #errors) | ||
| 324 | if #errors > 0 then | ||
| 325 | io.write("\n") | ||
| 326 | local out = {} | ||
| 316 | for i, err in ipairs(errors) do | 327 | for i, err in ipairs(errors) do |
| 317 | local msg = "Error at line " .. err.line .. " (col " .. err.col .. "): " .. err.msg | 328 | local msg = "Error at line " .. err.line .. " (col " .. err.col .. "): " .. err.msg |
| 318 | table.insert(out, msg) | 329 | table.insert(out, msg) |
| 319 | end | 330 | end |
| 320 | return nil, table.concat(out, "\n") .. "\n" | 331 | io.write(table.concat(out, "\n")) |
| 321 | end | 332 | end |
| 322 | return r | 333 | print("\n") |
| 334 | return r | ||
| 323 | end | 335 | end |
| 324 | 336 | ||
| 325 | print(mymatch(grec, "one,two")) | 337 | mymatch(grec, "one,two") |
| 326 | -- Captures (separated by ';'): one; two; | 338 | mymatch(grec, "one two three") |
| 327 | -- Syntactic errors found: 0 | 339 | mymatch(grec, "1,\n two, \n3,") |
| 328 | 340 | mymatch(grec, "one\n two123, \nthree,") | |
| 329 | print(mymatch(grec, "one two three")) | ||
| 330 | -- Captures (separated by ';'): one; two; three; | ||
| 331 | -- Syntactic errors found: 2 | ||
| 332 | -- Error at line 1 (col 4): expecting ',' | ||
| 333 | -- Error at line 1 (col 8): expecting ',' | ||
| 334 | |||
| 335 | print(mymatch(grec, "1,\n two, \n3,")) | ||
| 336 | -- Captures (separated by ';'): NONE; two; NONE; NONE; | ||
| 337 | -- Syntactic errors found: 3 | ||
| 338 | -- Error at line 1 (col 1): expecting an identifier | ||
| 339 | -- Error at line 2 (col 6): expecting an identifier | ||
| 340 | -- Error at line 3 (col 2): expecting an identifier | ||
| 341 | |||
| 342 | print(mymatch(grec, "one\n two123, \nthree,")) | ||
| 343 | -- Captures (separated by ';'): one; two; three; NONE; | ||
| 344 | -- Syntactic errors found: 3 | ||
| 345 | -- Error at line 2 (col 1): expecting ',' | ||
| 346 | -- Error at line 2 (col 5): expecting ',' | ||
| 347 | -- Error at line 3 (col 6): expecting an identifier | ||
| 348 | ``` | 341 | ``` |
| 349 | 342 | ||
| 350 | ##### *relabel* syntax | 343 | ##### *relabel* syntax |
