aboutsummaryrefslogtreecommitdiff
path: root/testlabel.lua
diff options
context:
space:
mode:
Diffstat (limited to 'testlabel.lua')
-rw-r--r--testlabel.lua139
1 files changed, 66 insertions, 73 deletions
diff --git a/testlabel.lua b/testlabel.lua
index 72eb9aa..90a8f9e 100644
--- a/testlabel.lua
+++ b/testlabel.lua
@@ -110,102 +110,95 @@ checklabeq({nil, '11', 1}, p:match("x"))
110checklabeq({nil, '11', 1}, p:match("kx")) 110checklabeq({nil, '11', 1}, p:match("kx"))
111 111
112 112
113-- throws a label that is not caught by the recovery operator 113-- throws a label without a corresponding recovery rule
114p = m.Rec(m.T(2), m.P"a", 1, 3) 114p = m.P{
115r, l, poserr = p:match(s) 115 "S",
116print(r, l, poserr) 116 S = m.T("bola"),
117 bolada = m.P"a"
118}
119r, l, poserr = p:match("abc")
120assert(r == nil and l == 'bola' and poserr == 1)
121
122-- throws a label without a corresponding recovery rule
123-- T(2) indexes key ["2"]
124p = m.P{
125 "S",
126 S = m.T(2),
127 [2] = m.P"a"
128}
129r, l, poserr = p:match("abc")
117assert(r == nil and l == '2' and poserr == 1) 130assert(r == nil and l == '2' and poserr == 1)
118 131
119-- wraps the previous pattern with a recovery that catches label "2" 132-- throws a label with a corresponding recovery rule
120p = m.Rec(p, m.P"a", 2) 133p = m.P{
121assert(p:match(s) == 2) 134 "S",
135 S = m.T("bola"),
136 bola = m.P"a"
137}
138r, l, poserr = p:match("abc")
139assert(r == 2)
122 140
123-- throws a label that is caught by recovery 141-- throws a label with a corresponding recovery rule
124p = m.Rec(m.T(25), m.P"a", 25) 142-- T(2) indexes key ["2"]
125assert(p:match(s) == 2) 143p = m.P{
144 "S",
145 S = m.T(2),
146 ["2"] = m.P"a"^0
147}
148r, l, poserr = p:match("aaabc")
149assert(r == 4)
150
151-- regular failure after the recovery
152p = m.P{
153 "S",
154 S = m.T(2),
155 ["2"] = m.P"a"^0 * m.P"c"
156}
157r, l, poserr = p:match("aaabc")
158assert(r == nil and l == 'fail' and poserr == 4)
126 159
127-- "fail" is label "0"
128-- throws the "fail" label after the recovery
129s = "bola" 160s = "bola"
130r, l, poserr = p:match("bola") 161r, l, poserr = p:match("bola")
131assert(r == nil and l == 0 and poserr == 1) 162assert(r == nil and l == 'fail' and poserr == 1)
132 163
133-- Recovery does not catch "fail" by default 164-- Recovery rules do not catch "fail" by default
134p = m.Rec(m.P"b", m.P"a", 1) 165p = m.P{
166 "S",
167 S = m.P"b" * m.T(2),
168 ["2"] = m.P"a"^0
169}
170r, l, poserr = p:match("c")
171assert(r == nil and l == 'fail' and poserr == 1)
135 172
136r, l, poserr = p:match("abc") 173assert(p:match("baa") == 4)
137assert(r == nil and l == 0 and poserr == 1)
138 174
139assert(p:match("bola") == 2)
140 175
176-- recovery rules for "2" or "3"
177-- when we use V instead of T, a recovery
178-- rule becomes a regular grammar rule
179p = m.P{
180 "S",
181 S = (m.P"a" + m.T(2)) * m.T(3),
182 ["3"] = m.V"2",
183 ["2"] = m.P"a" + m.P"b",
184}
141 185
142-- recovery operator catches "1" or "3"
143p = m.Rec((m.P"a" + m.T(1)) * m.T(3), (m.P"a" + m.P"b"), 1, 3)
144assert(p:match("aac") == 3) 186assert(p:match("aac") == 3)
145assert(p:match("abc") == 3) 187assert(p:match("abc") == 3)
146r, l, poserr = p:match("acc") 188r, l, poserr = p:match("acc")
147assert(r == nil and l == 0 and poserr == 2) 189assert(r == nil and l == 'fail' and poserr == 2)
148 190
149--throws 1, recovery pattern matches 'b', throw 3, and rec pat mathces 'a' 191--throws 2, recovery rule matches 'b', throw 3, and rec rule matches 'a'
150assert(p:match("bac") == 3) 192assert(p:match("bac") == 3)
151 193
152r, l, poserr = p:match("cab") 194r, l, poserr = p:match("cab")
153assert(r == nil and l == 0 and poserr == 1) 195assert(r == nil and l == 'fail' and poserr == 1)
154
155
156-- associativity
157-- (p1 / %1) //{1} (p2 / %2) //{2} p3
158-- left-associativity
159-- ("a" //{1} "b") //{2} "c"
160p = m.Rec(m.Rec(m.P"a" + m.T(1), m.P"b" + m.T(2), 1), m.P"c", 2)
161assert(p:match("abc") == 2)
162assert(p:match("bac") == 2)
163assert(p:match("cab") == 2)
164r, l, poserr = p:match("dab")
165assert(r == nil and l == 0 and poserr == 1)
166
167
168-- righ-associativity
169-- "a" //{1} ("b" //{2} "c")
170p = m.Rec(m.P"a" + m.T(1), m.Rec(m.P"b" + m.T(2), m.P"c", 2), 1)
171assert(p:match("abc") == 2)
172assert(p:match("bac") == 2)
173assert(p:match("cab") == 2)
174r, l, poserr = p:match("dab")
175assert(r == nil and l == 0 and poserr == 1)
176
177
178-- associativity -> in this case the error thrown by p1 is only
179-- recovered when we have a left-associative operator
180-- (p1 / %2) //{1} (p2 / %2) //{2} p3
181-- left-associativity
182-- ("a" //{1} "b") //{2} "c"
183p = m.Rec(m.Rec(m.P"a" + m.T(2), m.P"b" + m.T(2), 1), m.P"c", 2)
184assert(p:match("abc") == 2)
185r, l, poserr = p:match("bac")
186assert(r == nil and l == 0 and poserr == 1)
187assert(p:match("cab") == 2)
188r, l, poserr = p:match("dab")
189assert(r == nil and l == 0 and poserr == 1)
190
191
192-- righ-associativity
193-- "a" //{1} ("b" //{2} "c")
194p = m.Rec(m.P"a" + m.T(2), m.Rec(m.P"b" + m.T(2), m.P"c", 2), 1)
195assert(p:match("abc") == 2)
196r, l, poserr = p:match("bac")
197assert(r == nil and l == 2 and poserr == 1)
198r, l, poserr = p:match("cab")
199assert(r == nil and l == 2 and poserr == 1)
200r, l, poserr = p:match("dab")
201assert(r == nil and l == 2 and poserr == 1)
202
203 196
204 197
205-- tests related to predicates 198-- tests related to predicates
206p = #m.T(1) + m.P"a" 199p = #m.T(1) + m.P"a"
207r, l, poserr = p:match("abc") 200r, l, poserr = p:match("abc")
208assert(r == nil and l == 1 and poserr == 1) 201assert(r == nil and l == '1' and poserr == 1)
209 202
210p = ##m.T(1) + m.P"a" 203p = ##m.T(1) + m.P"a"
211r, l, poserr = p:match("abc") 204r, l, poserr = p:match("abc")