diff options
Diffstat (limited to 'testlabel.lua')
-rw-r--r-- | testlabel.lua | 239 |
1 files changed, 80 insertions, 159 deletions
diff --git a/testlabel.lua b/testlabel.lua index 90a8f9e..9e2a586 100644 --- a/testlabel.lua +++ b/testlabel.lua | |||
@@ -202,78 +202,77 @@ assert(r == nil and l == '1' and poserr == 1) | |||
202 | 202 | ||
203 | p = ##m.T(1) + m.P"a" | 203 | p = ##m.T(1) + m.P"a" |
204 | r, l, poserr = p:match("abc") | 204 | r, l, poserr = p:match("abc") |
205 | assert(r == nil and l == 1 and poserr == 1) | 205 | assert(r == nil and l == '1' and poserr == 1) |
206 | 206 | ||
207 | p = -m.T(1) * m.P"a" | 207 | p = -m.T(1) * m.P"a" |
208 | r, l, poserr = p:match("abc") | 208 | r, l, poserr = p:match("abc") |
209 | assert(r == nil and l == 1 and poserr == 1) | 209 | assert(r == nil and l == '1' and poserr == 1) |
210 | 210 | ||
211 | p = -m.T(1) * m.P"a" | 211 | p = -m.T(1) * m.P"a" |
212 | r, l, poserr = p:match("bbc") | 212 | r, l, poserr = p:match("bbc") |
213 | assert(r == nil and l == 1 and poserr == 1) | 213 | assert(r == nil and l == '1' and poserr == 1) |
214 | 214 | ||
215 | p = -(-m.T(1)) * m.P"a" | 215 | p = -(-m.T(1)) * m.P"a" |
216 | r, l, poserr = p:match("abc") | 216 | r, l, poserr = p:match("abc") |
217 | assert(r == nil and l == 1 and poserr == 1) | 217 | assert(r == nil and l == '1' and poserr == 1) |
218 | 218 | ||
219 | p = m.Rec(-m.T(22), m.P"a", 22) | 219 | p = m.P{ |
220 | "S", | ||
221 | S = -m.T(22), | ||
222 | ["22"] = m.P"a" | ||
223 | } | ||
220 | r, l, poserr = p:match("abc") | 224 | r, l, poserr = p:match("abc") |
221 | assert(r == nil and l == 0 and poserr == 2) | 225 | assert(r == nil and l == 'fail' and poserr == 2) |
222 | 226 | ||
223 | assert(p:match("bbc") == 1) | 227 | assert(p:match("bbc") == 1) |
224 | 228 | ||
225 | p = m.Rec(#m.T(22), m.P"a", 22) | 229 | p = m.P{ |
226 | assert(p:match("abc") == 1) | 230 | "S", |
227 | 231 | S = #m.T(22), | |
228 | p = #m.Rec(m.T(22), m.P"a", 22) | 232 | ["22"] = m.P"a" |
229 | assert(p:match("abc") == 1) | 233 | } |
230 | |||
231 | p = m.Rec(m.T(22), #m.P"a", 22) | ||
232 | assert(p:match("abc") == 1) | ||
233 | |||
234 | p = m.Rec(#m.T(22), m.P"a", 22) | ||
235 | r, l, poserr = p:match("bbc") | ||
236 | assert(r == nil and l == 0 and poserr == 1) | ||
237 | |||
238 | p = m.Rec(#m.P("a") * m.T(22), m.T(15), 22) | ||
239 | r, l, poserr = p:match("abc") | ||
240 | assert(r == nil and l == 15 and poserr == 1) | ||
241 | |||
242 | p = m.Rec(#(m.P("a") * m.T(22)), m.T(15), 22) | ||
243 | r, l, poserr = p:match("abc") | ||
244 | assert(r == nil and l == 15 and poserr == 2) | ||
245 | |||
246 | p = m.Lc(#m.T(22), m.P"a", 22) | ||
247 | assert(p:match("abc") == 2) | ||
248 | |||
249 | p = #m.Lc(m.T(22), m.P"a", 22) | ||
250 | assert(p:match("abc") == 1) | 234 | assert(p:match("abc") == 1) |
251 | 235 | ||
252 | p = m.Lc(m.T(22), #m.P"a", 22) | 236 | p = m.P{ |
237 | "S", | ||
238 | S = m.T(22), | ||
239 | ["22"] = #m.P"a" | ||
240 | } | ||
253 | assert(p:match("abc") == 1) | 241 | assert(p:match("abc") == 1) |
254 | 242 | ||
255 | p = m.Lc(#m.T(22), m.P"a", 22) | 243 | p = m.P{ |
244 | "S", | ||
245 | S = #m.T(22), | ||
246 | ["22"] = m.P"a" | ||
247 | } | ||
256 | r, l, poserr = p:match("bbc") | 248 | r, l, poserr = p:match("bbc") |
257 | assert(r == nil and l == 0 and poserr == 1) | 249 | assert(r == nil and l == 'fail' and poserr == 1) |
258 | 250 | ||
259 | p = m.Lc(#m.P("a") * m.T(22), m.T(15), 22) | 251 | p = m.P{ |
252 | "S", | ||
253 | S = #m.P"a" * m.T(22), | ||
254 | ["22"] = m.T(15) | ||
255 | } | ||
260 | r, l, poserr = p:match("abc") | 256 | r, l, poserr = p:match("abc") |
261 | assert(r == nil and l == 15 and poserr == 1) | 257 | assert(r == nil and l == '15' and poserr == 1) |
262 | 258 | ||
263 | p = m.Lc(#(m.P("a") * m.T(22)), m.T(15), 22) | 259 | p = m.P{ |
260 | "S", | ||
261 | S = #(m.P"a" * m.T(22)), | ||
262 | ["22"] = m.T(15) | ||
263 | } | ||
264 | r, l, poserr = p:match("abc") | 264 | r, l, poserr = p:match("abc") |
265 | assert(r == nil and l == 15 and poserr == 1) | 265 | assert(r == nil and l == '15' and poserr == 2) |
266 | |||
267 | 266 | ||
268 | 267 | ||
269 | -- tests related to repetition | 268 | -- tests related to repetition |
270 | p = m.T(1)^0 | 269 | p = m.T(1)^0 |
271 | r, l, poserr = p:match("ab") | 270 | r, l, poserr = p:match("ab") |
272 | assert(r == nil and l == 1 and poserr == 1) | 271 | assert(r == nil and l == '1' and poserr == 1) |
273 | 272 | ||
274 | p = (m.P"a" + m.T(1))^0 | 273 | p = (m.P"a" + m.T(1))^0 |
275 | r, l, poserr = p:match("aa") | 274 | r, l, poserr = p:match("aa") |
276 | assert(r == nil and l == 1 and poserr == 3) | 275 | assert(r == nil and l == '1' and poserr == 3) |
277 | 276 | ||
278 | 277 | ||
279 | -- Bug reported by Matthew Allen | 278 | -- Bug reported by Matthew Allen |
@@ -281,18 +280,19 @@ assert(r == nil and l == 1 and poserr == 3) | |||
281 | -- applied in case of labels | 280 | -- applied in case of labels |
282 | 281 | ||
283 | -- recovery operator | 282 | -- recovery operator |
284 | p = m.Rec(m.P"A", m.P(true), 1) + m.P("B") | 283 | p = m.P{ |
285 | assert(p:match("B") == 2) | 284 | "S", |
286 | 285 | S = m.P"A" + m.P"B", | |
287 | p = m.Rec(m.P"A", m.P(false), 1) + m.P("B") | 286 | ["2"] = m.P(true) |
288 | assert(p:match("B") == 2) | 287 | } |
289 | |||
290 | 288 | ||
291 | -- labeled choices | ||
292 | p = m.Lc(m.P"A", m.P(true), 1) + m.P("B") | ||
293 | assert(p:match("B") == 2) | 289 | assert(p:match("B") == 2) |
294 | 290 | ||
295 | p = m.Lc(m.P"A", m.P(false), 1) + m.P("B") | 291 | p = m.P{ |
292 | "S", | ||
293 | S = m.P"A" + m.P"B", | ||
294 | ["2"] = m.P(false) | ||
295 | } | ||
296 | assert(p:match("B") == 2) | 296 | assert(p:match("B") == 2) |
297 | 297 | ||
298 | 298 | ||
@@ -303,152 +303,73 @@ B -> %1 | |||
303 | ]] | 303 | ]] |
304 | g = m.P{ | 304 | g = m.P{ |
305 | "S", | 305 | "S", |
306 | S = m.Rec(m.V"A", m.P"a", 1), | 306 | S = m.V"A", |
307 | A = m.V"B", | 307 | A = m.V"B", |
308 | B = m.T(1), | 308 | B = m.T(2), |
309 | ["2"] = m.P'a' | ||
309 | } | 310 | } |
310 | assert(g:match("ab") == 2) | 311 | assert(g:match("ab") == 2) |
311 | r, l, poserr = g:match("bc") | 312 | r, l, poserr = g:match("bc") |
312 | assert(r == nil and l == 0 and poserr == 1) | 313 | assert(r == nil and l == 'fail' and poserr == 1) |
313 | 314 | ||
314 | 315 | ||
315 | --[[ | 316 | --[[ |
316 | S -> A | 317 | S -> A |
317 | A -> (B (';' / %{1}))* | 318 | A -> (B (';' / %{2}))* |
318 | B -> 'a' | 319 | B -> 'a' |
319 | ]] | 320 | ]] |
320 | g = m.P{ | 321 | g = m.P{ |
321 | "S", | 322 | "S", |
322 | S = m.V"A", | 323 | S = m.V"A", |
323 | A = m.P(m.V"B" * (";" + m.T(1)))^0, | 324 | A = m.P(m.V"B" * (";" + m.T(2)))^0, |
324 | B = m.P'a', | 325 | B = m.P'a', |
325 | } | 326 | } |
326 | assert(g:match("a;a;") == 5) | 327 | assert(g:match("a;a;") == 5) |
327 | 328 | ||
328 | r, l, poserr = g:match("a;a") | 329 | r, l, poserr = g:match("a;a") |
329 | assert(r == nil and l == 1 and poserr == 4) | 330 | assert(r == nil and l == '2' and poserr == 4) |
330 | |||
331 | 331 | ||
332 | -- %1 //{1,3} %2 //{2} 'a' | ||
333 | p = m.Rec(m.Rec(m.T(1), m.T(2), 1, 3), m.P"a", 2) | ||
334 | assert(p:match("abc") == 2) | ||
335 | |||
336 | r, l, poserr = p:match("") | ||
337 | assert(r == nil and l == 0 and poserr == 1) | ||
338 | 332 | ||
339 | p = m.Rec(m.T(1), m.Rec(m.T(2), m.P"a", 2), 1, 3) | 333 | p = m.P{ |
340 | assert(p:match("abc") == 2) | 334 | "S", |
341 | 335 | S = m.T'A', | |
342 | r, l, poserr = p:match("") | 336 | A = m.T'B', |
343 | assert(r == nil and l == 0 and poserr == 1) | 337 | B = m.P'a' |
344 | |||
345 | -- labeled choice | ||
346 | --[[ | ||
347 | S -> A /{1} 'a' | ||
348 | A -> B | ||
349 | B -> %1 | ||
350 | ]] | ||
351 | g = m.P{ | ||
352 | "S", | ||
353 | S = m.Lc(m.V"A", m.P"a", 1), | ||
354 | A = m.V"B", | ||
355 | B = m.T(1), | ||
356 | } | ||
357 | assert(g:match("ab") == 2) | ||
358 | r, l, poserr = g:match("bc") | ||
359 | assert(r == nil and l == 0 and poserr == 1) | ||
360 | |||
361 | |||
362 | --[[ | ||
363 | S -> A | ||
364 | A -> (B (';' / %{1}))* | ||
365 | B -> 'a' | ||
366 | ]] | ||
367 | g = m.P{ | ||
368 | "S", | ||
369 | S = m.V"A", | ||
370 | A = m.P(m.V"B" * (";" + m.T(1)))^0, | ||
371 | B = m.P'a', | ||
372 | } | 338 | } |
373 | assert(g:match("a;a;") == 5) | ||
374 | |||
375 | r, l, poserr = g:match("a;a") | ||
376 | assert(r == nil and l == 1 and poserr == 4) | ||
377 | |||
378 | |||
379 | -- %1 /{1,3} %2 /{2} 'a' | ||
380 | p = m.Lc(m.Lc(m.T(1), m.T(2), 1, 3), m.P"a", 2) | ||
381 | assert(p:match("abc") == 2) | ||
382 | |||
383 | r, l, poserr = p:match("") | ||
384 | assert(r == nil and l == 0 and poserr == 1) | ||
385 | |||
386 | p = m.Lc(m.T(1), m.Lc(m.T(2), m.P"a", 2), 1, 3) | ||
387 | assert(p:match("abc") == 2) | 339 | assert(p:match("abc") == 2) |
388 | 340 | ||
389 | r, l, poserr = p:match("") | 341 | r, l, poserr = p:match("") |
390 | assert(r == nil and l == 0 and poserr == 1) | 342 | assert(r == nil and l == 'fail' and poserr == 1) |
391 | 343 | ||
392 | 344 | ||
393 | -- Infinte Loop TODO: check the semantics | 345 | -- Infinte Loop TODO: check the semantics |
394 | -- %1 //{1} %1 | 346 | p = m.P{ |
395 | p = m.Rec(m.T(1), m.T(1), 1) | 347 | "S", |
348 | S = m.T"A", | ||
349 | A = m.T"S", | ||
350 | } | ||
396 | --r, l, poserr = p:match("ab") | 351 | --r, l, poserr = p:match("ab") |
397 | --assert(r == nil and l == 1 and poserr == "ab") | 352 | --assert(r == nil and l == 1 and poserr == "ab") |
398 | 353 | ||
399 | -- %1 //{1} 'a' (!. / %1) | 354 | p = m.P{ |
400 | p = m.Rec(m.T(1), m.P"a" * (-m.P(1) + m.T(1)), 1) | 355 | "S", |
356 | S = m.T"A", | ||
357 | A = m.P'a' * (-m.P(1) + m.T"A"), | ||
358 | } | ||
401 | r, l, poserr = p:match("ab") | 359 | r, l, poserr = p:match("ab") |
402 | assert(r == nil and l == 0 and poserr == 2) | 360 | assert(r == nil and l == 'fail' and poserr == 2) |
403 | 361 | ||
404 | r, l, poserr = p:match("cd") | 362 | r, l, poserr = p:match("cd") |
405 | assert(r == nil and l == 0 and poserr == 1) | 363 | assert(r == nil and l == 'fail' and poserr == 1) |
406 | 364 | ||
407 | -- %1 //{1} . (!. / %1) | 365 | p = m.P{ |
408 | p = m.Rec(m.T(1), m.P(1) * (-m.P(1) + m.T(1)), 1) | 366 | "S", |
367 | S = m.T"A", | ||
368 | A = m.P(1) * (-m.P(1) + m.T"A"), | ||
369 | } | ||
409 | assert(p:match("abc") == 4) | 370 | assert(p:match("abc") == 4) |
410 | 371 | ||
411 | 372 | ||
412 | -- testing the limit of labels | ||
413 | -- can only throw labels between 1 and 255 | ||
414 | local r = pcall(m.Rec, m.P"b", m.P"a", 0) | ||
415 | assert(r == false) | ||
416 | |||
417 | local r = pcall(m.Rec, m.P"b", m.P"a", 256) | ||
418 | assert(r == false) | ||
419 | |||
420 | local r = pcall(m.Rec, m.P"b", m.P"a", -1) | ||
421 | assert(r == false) | ||
422 | |||
423 | local r = pcall(m.Lc, m.P"b", m.P"a", 0) | ||
424 | assert(r == false) | ||
425 | |||
426 | local r = pcall(m.Lc, m.P"b", m.P"a", 256) | ||
427 | assert(r == false) | ||
428 | |||
429 | local r = pcall(m.Lc, m.P"b", m.P"a", -1) | ||
430 | assert(r == false) | ||
431 | |||
432 | local r = pcall(m.T, 0) | ||
433 | assert(r == false) | ||
434 | |||
435 | local r = pcall(m.T, 256) | ||
436 | assert(r == false) | ||
437 | |||
438 | local r = pcall(m.T, -1) | ||
439 | assert(r == false) | ||
440 | |||
441 | |||
442 | local r = m.Rec(m.P"b", m.P"a", 255) | ||
443 | assert(p:match("a") == 2) | ||
444 | |||
445 | p = m.T(255) | ||
446 | s = "abc" | ||
447 | r, l, poserr = p:match(s) | ||
448 | assert(r == nil and l == 255 and poserr == 1) | ||
449 | |||
450 | |||
451 | |||
452 | print("+") | 373 | print("+") |
453 | 374 | ||
454 | --[[ grammar based on Figure 8 of paper submitted to SCP | 375 | --[[ grammar based on Figure 8 of paper submitted to SCP |