1
1
import test from 'ava' ;
2
- import Parser , { item , empty , satisfy , lift2 , sequence , disj , infixl , infixr , token , regex } from './index' ;
2
+ import Parser , { item , empty , satisfy , lift2 , sequence , alternatives , infixl , infixr , token , regex } from './index' ;
3
3
4
4
test ( 'item() from array-likes' , t => {
5
5
t . true ( item ( ) . parse ( '123' ) . success ) ;
@@ -205,49 +205,110 @@ test('sequence', t => {
205
205
) ;
206
206
} )
207
207
208
- test ( 'disj ' , t => {
208
+ test ( 'alternatives ' , t => {
209
209
let one = satisfy ( x => x === 1 ) . map ( x => '' + x ) ;
210
210
let two = satisfy ( x => x === 2 ) . map ( x => '' + x ) ;
211
211
212
- t . false ( disj ( one , two ) . parse ( [ ] ) . success ) ;
213
- t . false ( disj ( one , two ) . parse ( [ 3 ] ) . success ) ;
214
- t . false ( disj ( one , two ) . parse ( [ 3 , 1 ] ) . success ) ;
212
+ t . false ( alternatives ( one , two ) . parse ( [ ] ) . success ) ;
213
+ t . false ( alternatives ( one , two ) . parse ( [ 3 ] ) . success ) ;
214
+ t . false ( alternatives ( one , two ) . parse ( [ 3 , 1 ] ) . success ) ;
215
215
216
- t . true ( disj ( one , two ) . parse ( [ 1 ] ) . success ) ;
216
+ t . true ( alternatives ( one , two ) . parse ( [ 1 ] ) . success ) ;
217
217
t . deepEqual (
218
- disj ( one , two ) . parse ( [ 1 ] ) . result . value ,
218
+ alternatives ( one , two ) . parse ( [ 1 ] ) . result . value ,
219
219
'1'
220
220
) ;
221
221
t . deepEqual (
222
- disj ( one , two ) . parse ( [ 2 ] ) . result . value ,
222
+ alternatives ( one , two ) . parse ( [ 2 ] ) . result . value ,
223
223
'2'
224
224
) ;
225
225
t . deepEqual (
226
- disj ( one , two ) . parse ( [ 2 , 1 ] ) . result . value ,
226
+ alternatives ( one , two ) . parse ( [ 2 , 1 ] ) . result . value ,
227
227
'2'
228
228
) ;
229
229
230
230
} ) ;
231
231
232
- test ( 'infixl' , t => {
233
- let minus = satisfy ( x => x === '-' ) ;
234
- let num = satisfy ( x => typeof x === 'number' ) ;
235
-
232
+ test ( 'operator' , t => {
233
+ let number = satisfy ( x => typeof x === 'number' ) ;
234
+ let basicOperators = [ {
235
+ type : 'left' ,
236
+ prec : 2 ,
237
+ parser : token ( '+' ) ,
238
+ action ( left , right ) {
239
+ return left + right ;
240
+ }
241
+ } , {
242
+ type : 'left' ,
243
+ prec : 3 ,
244
+ parser : token ( '*' ) ,
245
+ action ( left , right ) {
246
+ return left * right ;
247
+ }
248
+ } , {
249
+ type : 'prefix' ,
250
+ prec : 1 ,
251
+ parser : token ( '-' ) ,
252
+ action ( operand ) {
253
+ return - operand ;
254
+ }
255
+ } , {
256
+ type : 'right' ,
257
+ prec : 3 ,
258
+ parser : token ( '/' ) ,
259
+ action ( left , right ) {
260
+ return left / right ;
261
+ }
262
+ } ]
263
+
264
+ t . false ( number . operators ( basicOperators ) . parse ( [ ] ) . success ) ;
265
+ t . false ( number . operators ( basicOperators ) . parse ( [ '1' ] ) . success ) ;
266
+
267
+ t . true ( number . operators ( basicOperators ) . parse ( [ 1 ] ) . success ) ;
236
268
t . is (
237
- infixl ( num , minus . map ( ( ) => ( x , y ) => x - y ) ) . parse ( [ 0 , '-' , 1 , '- ' , 1 ] ) . result . value ,
238
- - 2
269
+ number . operators ( basicOperators ) . parse ( [ 1 , '+ ' , 2 ] ) . result . value ,
270
+ 3
239
271
) ;
240
- } ) ;
241
-
242
- test ( 'infixr' , t => {
243
- let minus = satisfy ( x => x === '-' ) ;
244
- let num = satisfy ( x => typeof x === 'number' ) ;
245
-
246
272
t . is (
247
- infixr ( num , minus . map ( ( ) => ( x , y ) => x - y ) ) . parse ( [ 0 , '- ' , 1 , '- ' , 1 ] ) . result . value ,
248
- 0
273
+ number . operators ( basicOperators ) . parse ( [ 1 , '+ ' , 2 , '* ' , 3 ] ) . result . value ,
274
+ 7
249
275
) ;
250
- } )
276
+ t . is (
277
+ number . operators ( basicOperators ) . parse ( [ 2 , '*' , 3 , '+' , 1 ] ) . result . value ,
278
+ 7
279
+ ) ;
280
+ t . is (
281
+ number . operators ( basicOperators ) . parse ( [ 10 , '/' , 5 , '/' , 2 ] ) . result . value ,
282
+ 4
283
+ ) ;
284
+ t . is (
285
+ number . operators ( basicOperators ) . parse ( [ 1 , '+' , '-' , 2 ] ) . result . value ,
286
+ - 1
287
+ ) ;
288
+ t . is (
289
+ number . operators ( basicOperators ) . parse ( [ '-' , 2 , '+' , 1 ] ) . result . value ,
290
+ - 1
291
+ ) ;
292
+ t . is (
293
+ number . operators ( [ {
294
+ type : 'left' ,
295
+ prec : 2 ,
296
+ parser : token ( '+' ) ,
297
+ action ( left , right ) {
298
+ return left + right ;
299
+ }
300
+ } , {
301
+ type : 'prefix' ,
302
+ prec : 3 , // bigger than plus prec
303
+ parser : token ( '-' ) ,
304
+ action ( operand ) {
305
+ return - operand ;
306
+ }
307
+
308
+ } ] ) . parse ( [ '-' , 2 , '+' , 1 ] ) . result . value ,
309
+ - 3
310
+ ) ;
311
+ } ) ;
251
312
252
313
test ( 'CSV parser' , t => {
253
314
let comma = token ( ',' ) ;
@@ -257,7 +318,7 @@ test('CSV parser', t => {
257
318
258
319
let escaped = sequence (
259
320
dquote ,
260
- disj (
321
+ alternatives (
261
322
dquote . then ( dquote ) ,
262
323
textdata ,
263
324
comma ,
0 commit comments