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