diff options
| -rw-r--r-- | testlabel.lua | 87 |
1 files changed, 65 insertions, 22 deletions
diff --git a/testlabel.lua b/testlabel.lua index 100c0d0..ea18bf5 100644 --- a/testlabel.lua +++ b/testlabel.lua | |||
| @@ -5,8 +5,7 @@ assert(p:match("abc") == nil) | |||
| 5 | 5 | ||
| 6 | -- throws a label that is not caught by ordinary choice | 6 | -- throws a label that is not caught by ordinary choice |
| 7 | p = m.T(1) + m.P"a" | 7 | p = m.T(1) + m.P"a" |
| 8 | local r = p:match("abc") | 8 | assert(p:match("abc") == nil) |
| 9 | assert(r == nil) | ||
| 10 | 9 | ||
| 11 | -- again throws a label that is not caught by ordinary choice | 10 | -- again throws a label that is not caught by ordinary choice |
| 12 | local g = m.P{ | 11 | local g = m.P{ |
| @@ -15,46 +14,94 @@ local g = m.P{ | |||
| 15 | A = m.T(1), | 14 | A = m.T(1), |
| 16 | B = m.P"a" | 15 | B = m.P"a" |
| 17 | } | 16 | } |
| 18 | r = g:match("abc") | 17 | assert(g:match("abc") == nil) |
| 19 | assert(r == nil) | ||
| 20 | 18 | ||
| 21 | -- throws a label that is not caught by labeled choice | 19 | -- throws a label that is not caught by labeled choice |
| 22 | p = m.Lc(m.T(2), m.P"a", 1, 3) | 20 | p = m.Lc(m.T(2), m.P"a", 1, 3) |
| 23 | r = p:match("abc") | 21 | assert(p:match("abc") == nil) |
| 24 | assert(r == nil) | ||
| 25 | 22 | ||
| 26 | -- modifies previous pattern | 23 | -- modifies previous pattern |
| 27 | -- adds another labeled choice to catch label "2" | 24 | -- adds another labeled choice to catch label "2" |
| 28 | p = m.Lc(p, m.P"a", 2) | 25 | p = m.Lc(p, m.P"a", 2) |
| 29 | r = p:match("abc") | 26 | assert(p:match("abc") == 2) |
| 30 | assert(r == 2) | ||
| 31 | 27 | ||
| 32 | -- throws a label that is caught by labeled choice | 28 | -- throws a label that is caught by labeled choice |
| 33 | p = m.Lc(m.T(25), m.P"a", 25) | 29 | p = m.Lc(m.T(25), m.P"a", 25) |
| 34 | r = p:match("abc") | 30 | assert(p:match("abc") == 2) |
| 35 | assert(r == 2) | ||
| 36 | assert(p:match("bola") == nil) | 31 | assert(p:match("bola") == nil) |
| 37 | 32 | ||
| 38 | -- labeled choice did not catch "fail" by default | 33 | -- labeled choice does not catch "fail" by default |
| 39 | p = m.Lc(m.P"b", m.P"a", 1) | 34 | p = m.Lc(m.P"b", m.P"a", 1) |
| 40 | r = p:match("abc") | 35 | assert(p:match("abc") == nil) |
| 41 | assert(r == nil, r) | ||
| 42 | assert(p:match("bola") == 2) | 36 | assert(p:match("bola") == 2) |
| 43 | 37 | ||
| 44 | -- "fail" is label "0" | 38 | -- "fail" is label "0" |
| 45 | -- labeled choice can catch "fail" | 39 | -- labeled choice can catch "fail" |
| 46 | p = m.Lc(m.P"b", m.P"a", 0) | 40 | p = m.Lc(m.P"b", m.P"a", 0) |
| 47 | r = p:match("abc") | 41 | assert(p:match("abc") == 2) |
| 48 | assert(r == 2, r) | ||
| 49 | assert(p:match("bola") == 2) | 42 | assert(p:match("bola") == 2) |
| 50 | 43 | ||
| 51 | -- "fail" is label "0" | 44 | -- "fail" is label "0" |
| 52 | -- labeled choice can catch "fail" or "3" | 45 | -- labeled choice catches "fail" or "3" |
| 53 | p = m.Lc(m.P"a" * m.T(3), (m.P"a" + m.P"b"), 0, 3) | 46 | p = m.Lc(m.P"a" * m.T(3), (m.P"a" + m.P"b"), 0, 3) |
| 54 | assert(p:match("abc") == 2) | 47 | assert(p:match("abc") == 2) |
| 55 | assert(p:match("bac") == 2) | 48 | assert(p:match("bac") == 2) |
| 56 | assert(p:match("cab") == nil) | 49 | assert(p:match("cab") == nil) |
| 57 | 50 | ||
| 51 | -- tests related to predicates | ||
| 52 | p = #m.T(1) + m.P"a" | ||
| 53 | assert(p:match("abc") == nil) | ||
| 54 | |||
| 55 | p = ##m.T(1) + m.P"a" | ||
| 56 | assert(p:match("abc") == nil) | ||
| 57 | |||
| 58 | p = #m.T(0) * m.P"a" | ||
| 59 | assert(p:match("abc") == fail) | ||
| 60 | |||
| 61 | p = #m.T(0) + m.P"a" | ||
| 62 | assert(p:match("abc") == 2) | ||
| 63 | |||
| 64 | p = -m.T(1) * m.P"a" | ||
| 65 | assert(p:match("abc") == nil) | ||
| 66 | |||
| 67 | p = -(-m.T(1)) * m.P"a" | ||
| 68 | assert(p:match("abc") == nil) | ||
| 69 | |||
| 70 | p = -m.T(0) * m.P"a" | ||
| 71 | assert(p:match("abc") == 2) | ||
| 72 | |||
| 73 | p = -m.T(0) + m.P"a" | ||
| 74 | assert(p:match("abc") == 1) | ||
| 75 | |||
| 76 | p = -(-m.T(0)) + m.P"a" | ||
| 77 | assert(p:match("abc") == 2) | ||
| 78 | |||
| 79 | p = m.Lc(-m.T(22), m.P"a", 22) | ||
| 80 | assert(p:match("abc") == 2) | ||
| 81 | |||
| 82 | p = m.Lc(-m.T(0), m.P"a", 0) | ||
| 83 | assert(p:match("abc") == 1) | ||
| 84 | |||
| 85 | p = m.Lc(#m.T(22), m.P"a", 22) | ||
| 86 | assert(p:match("abc") == 2) | ||
| 87 | |||
| 88 | p = m.Lc(#m.T(0), m.P"a", 0) | ||
| 89 | assert(p:match("abc") == 2) | ||
| 90 | |||
| 91 | -- tests related to repetition | ||
| 92 | p = m.T(1)^0 | ||
| 93 | assert(p:match("ab") == nil) | ||
| 94 | |||
| 95 | p = m.T(0)^0 | ||
| 96 | assert(p:match("ab") == 1) | ||
| 97 | |||
| 98 | p = (m.P"a" + m.T(1))^0 | ||
| 99 | assert(p:match("aa") == nil) | ||
| 100 | |||
| 101 | p = (m.P"a" + m.T(0))^0 | ||
| 102 | assert(p:match("aa") == 3) | ||
| 103 | |||
| 104 | |||
| 58 | --[[ | 105 | --[[ |
| 59 | S -> A /{1} 'a' | 106 | S -> A /{1} 'a' |
| 60 | A -> B | 107 | A -> B |
| @@ -85,16 +132,13 @@ assert(g:match("a;a;") == 5) | |||
| 85 | assert(g:match("a;a") == nil) | 132 | assert(g:match("a;a") == nil) |
| 86 | 133 | ||
| 87 | 134 | ||
| 88 | |||
| 89 | -- %1 /{1,3} %2 /{2} 'a' | 135 | -- %1 /{1,3} %2 /{2} 'a' |
| 90 | p = m.Lc(m.Lc(m.T(1), m.T(2), 1, 3), m.P"a", 2) | 136 | p = m.Lc(m.Lc(m.T(1), m.T(2), 1, 3), m.P"a", 2) |
| 91 | r = p:match("abc") | 137 | assert(p:match("abc") == 2) |
| 92 | assert(r == 2) | ||
| 93 | assert(p:match("") == nil) | 138 | assert(p:match("") == nil) |
| 94 | 139 | ||
| 95 | p = m.Lc(m.T(1), m.Lc(m.T(2), m.P"a", 2), 1, 3) | 140 | p = m.Lc(m.T(1), m.Lc(m.T(2), m.P"a", 2), 1, 3) |
| 96 | r = p:match("abc") | 141 | assert(p:match("abc") == 2) |
| 97 | assert(r == 2) | ||
| 98 | assert(p:match("") == nil) | 142 | assert(p:match("") == nil) |
| 99 | 143 | ||
| 100 | print("+") | 144 | print("+") |
| @@ -129,7 +173,6 @@ g = m.P{ | |||
| 129 | I = sp * m.P"int", | 173 | I = sp * m.P"int", |
| 130 | Exp = sp * m.P"E", | 174 | Exp = sp * m.P"E", |
| 131 | } | 175 | } |
| 132 | --g:pcode() | ||
| 133 | 176 | ||
| 134 | local s = "a" | 177 | local s = "a" |
| 135 | assert(g:match(s) == #s + 1) --1 | 178 | assert(g:match(s) == #s + 1) --1 |
