Class: Oga::XPath::Parser Private

Inherits:
LL::Driver
  • Object
show all
Defined in:
lib/oga/xpath/parser.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

API:

  • private

Constant Summary collapse

CONFIG =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

API:

  • private

LL::DriverConfig.new
CACHE =

This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.

Returns:

API:

  • private

LRU.new

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ Parser

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Parser.

Parameters:

  • The input to parse.

API:

  • private



260
261
262
# File 'lib/oga/xpath/parser.rb', line 260

def initialize(data)
  @lexer = Lexer.new(data)
end

Class Method Details

.parse_with_cache(data) ⇒ AST::Node

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Parameters:

Returns:

API:

  • private



255
256
257
# File 'lib/oga/xpath/parser.rb', line 255

def self.parse_with_cache(data)
  CACHE.get_or_set(data) { new(data).parse }
end

Instance Method Details

#_rule_0(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



308
309
310
# File 'lib/oga/xpath/parser.rb', line 308

def _rule_0(val)
  val[0]
end

#_rule_1(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



312
313
314
# File 'lib/oga/xpath/parser.rb', line 312

def _rule_1(val)
   combine_operators(val) 
end

#_rule_10(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



348
349
350
# File 'lib/oga/xpath/parser.rb', line 348

def _rule_10(val)
   [:gt, val[1]] 
end

#_rule_11(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



352
353
354
# File 'lib/oga/xpath/parser.rb', line 352

def _rule_11(val)
   [:lte, val[1]] 
end

#_rule_12(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



356
357
358
# File 'lib/oga/xpath/parser.rb', line 356

def _rule_12(val)
   [:gte, val[1]] 
end

#_rule_13(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



360
361
362
# File 'lib/oga/xpath/parser.rb', line 360

def _rule_13(val)
   combine_operators(val) 
end

#_rule_14(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



364
365
366
# File 'lib/oga/xpath/parser.rb', line 364

def _rule_14(val)
   [:add, val[1]] 
end

#_rule_15(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



368
369
370
# File 'lib/oga/xpath/parser.rb', line 368

def _rule_15(val)
   [:sub, val[1]] 
end

#_rule_16(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



372
373
374
# File 'lib/oga/xpath/parser.rb', line 372

def _rule_16(val)
   combine_optional_operator(val) 
end

#_rule_17(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



376
377
378
# File 'lib/oga/xpath/parser.rb', line 376

def _rule_17(val)
   [:div, val[1]] 
end

#_rule_18(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



380
381
382
# File 'lib/oga/xpath/parser.rb', line 380

def _rule_18(val)
   [:mod, val[1]] 
end

#_rule_19(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



384
385
386
# File 'lib/oga/xpath/parser.rb', line 384

def _rule_19(val)
   [:mul, val[1]] 
end

#_rule_2(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



316
317
318
# File 'lib/oga/xpath/parser.rb', line 316

def _rule_2(val)
   [:or, val[1]] 
end

#_rule_20(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



388
389
390
# File 'lib/oga/xpath/parser.rb', line 388

def _rule_20(val)
   combine_operators(val) 
end

#_rule_21(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



392
393
394
# File 'lib/oga/xpath/parser.rb', line 392

def _rule_21(val)
   [:pipe, val[1]] 
end

#_rule_22(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



396
397
398
# File 'lib/oga/xpath/parser.rb', line 396

def _rule_22(val)
  val[0]
end

#_rule_23(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



400
401
402
# File 'lib/oga/xpath/parser.rb', line 400

def _rule_23(val)
  val[0]
end

#_rule_24(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



404
405
406
# File 'lib/oga/xpath/parser.rb', line 404

def _rule_24(val)
  val[0]
end

#_rule_25(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



408
409
410
# File 'lib/oga/xpath/parser.rb', line 408

def _rule_25(val)
  val[0]
end

#_rule_26(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



412
413
414
# File 'lib/oga/xpath/parser.rb', line 412

def _rule_26(val)
  val[0]
end

#_rule_27(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



416
417
418
# File 'lib/oga/xpath/parser.rb', line 416

def _rule_27(val)
   val[1] 
end

#_rule_28(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



420
421
422
423
424
425
426
427
428
# File 'lib/oga/xpath/parser.rb', line 420

def _rule_28(val)
  
    if val[1]
      s(:absolute_path, val[1])
    else
      s(:absolute_path)
    end
  
end

#_rule_29(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



430
431
432
# File 'lib/oga/xpath/parser.rb', line 430

def _rule_29(val)
  val[0]
end

#_rule_3(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



320
321
322
# File 'lib/oga/xpath/parser.rb', line 320

def _rule_3(val)
   combine_operators(val) 
end

#_rule_30(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



434
435
436
# File 'lib/oga/xpath/parser.rb', line 434

def _rule_30(val)
  val[0]
end

#_rule_31(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
# File 'lib/oga/xpath/parser.rb', line 438

def _rule_31(val)
  
    type = val[1][0]
    args = val[1][1]
    pred = val[1][2]
    more = val[1][3]

    if type.equal?(:test)
      # Whenever a bare test is used (e.g. just "A") this actually means
      # "child::A". Handling this on parser level is the easiest.
      if args
        node = s(:axis, 'child', s(:test, val[0], args))
      else
        node = s(:axis, 'child', s(:test, nil, val[0]))
      end
    else
      node = s(type, val[0], *args)
    end

    if pred
      node = s(:predicate, node, pred)
    end

    if more
      node = node.updated(nil, node.children + [more])
    end

    node
  
end

#_rule_32(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
# File 'lib/oga/xpath/parser.rb', line 469

def _rule_32(val)
  
    pred = val[1]
    more = val[2]
    node = s(:axis, 'child', val[0])

    if pred
      node = s(:predicate, node, pred)
    end

    if more
      node = node.updated(nil, node.children + [more])
    end

    node
  
end

#_rule_33(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



487
488
489
# File 'lib/oga/xpath/parser.rb', line 487

def _rule_33(val)
   [:call, val[1]] 
end

#_rule_34(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



491
492
493
# File 'lib/oga/xpath/parser.rb', line 491

def _rule_34(val)
   [:test, val[1], val[2], val[3]] 
end

#_rule_35(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



495
496
497
# File 'lib/oga/xpath/parser.rb', line 495

def _rule_35(val)
   [:test, nil, val[0], val[1]] 
end

#_rule_36(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



499
500
501
# File 'lib/oga/xpath/parser.rb', line 499

def _rule_36(val)
   val[1] 
end

#_rule_37(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



503
504
505
# File 'lib/oga/xpath/parser.rb', line 503

def _rule_37(val)
   val[1] 
end

#_rule_38(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



507
508
509
# File 'lib/oga/xpath/parser.rb', line 507

def _rule_38(val)
   s(:type_test, val[0]) 
end

#_rule_39(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



511
512
513
514
515
# File 'lib/oga/xpath/parser.rb', line 511

def _rule_39(val)
  
    val[1] ? s(:test, val[0], val[1]) : s(:test, nil, val[0])
  
end

#_rule_4(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



324
325
326
# File 'lib/oga/xpath/parser.rb', line 324

def _rule_4(val)
   [:and, val[1]] 
end

#_rule_40(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



517
518
519
# File 'lib/oga/xpath/parser.rb', line 517

def _rule_40(val)
   val[1] 
end

#_rule_41(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



521
522
523
# File 'lib/oga/xpath/parser.rb', line 521

def _rule_41(val)
   [val[0], *val[1]] 
end

#_rule_42(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



525
526
527
# File 'lib/oga/xpath/parser.rb', line 525

def _rule_42(val)
  val
end

#_rule_43(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



529
530
531
# File 'lib/oga/xpath/parser.rb', line 529

def _rule_43(val)
   val[1] 
end

#_rule_44(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
# File 'lib/oga/xpath/parser.rb', line 533

def _rule_44(val)
  
    ret  = s(:axis, val[0], val[1])
    more = val[3]

    if val[2]
      ret = s(:predicate, ret, val[2])
    end

    if more
      ret = ret.updated(nil, ret.children + [more])
    end

    ret
  
end

#_rule_45(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



550
551
552
# File 'lib/oga/xpath/parser.rb', line 550

def _rule_45(val)
  val[0]
end

#_rule_46(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



554
555
556
# File 'lib/oga/xpath/parser.rb', line 554

def _rule_46(val)
  val[0]
end

#_rule_47(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



558
559
560
# File 'lib/oga/xpath/parser.rb', line 558

def _rule_47(val)
   s(:string, val[0]) 
end

#_rule_48(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



562
563
564
# File 'lib/oga/xpath/parser.rb', line 562

def _rule_48(val)
   s(:int, val[0]) 
end

#_rule_49(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



566
567
568
# File 'lib/oga/xpath/parser.rb', line 566

def _rule_49(val)
   s(:float, val[0]) 
end

#_rule_5(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



328
329
330
# File 'lib/oga/xpath/parser.rb', line 328

def _rule_5(val)
   combine_operators(val) 
end

#_rule_50(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



570
571
572
# File 'lib/oga/xpath/parser.rb', line 570

def _rule_50(val)
   s(:var, val[0]) 
end

#_rule_51(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



574
575
576
# File 'lib/oga/xpath/parser.rb', line 574

def _rule_51(val)
  val[0]
end

#_rule_52(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



578
579
580
# File 'lib/oga/xpath/parser.rb', line 578

def _rule_52(val)
  val[0]
end

#_rule_53(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



582
583
584
# File 'lib/oga/xpath/parser.rb', line 582

def _rule_53(val)
  val[0]
end

#_rule_54(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



586
587
588
# File 'lib/oga/xpath/parser.rb', line 586

def _rule_54(val)
  val[0]
end

#_rule_55(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



590
591
592
# File 'lib/oga/xpath/parser.rb', line 590

def _rule_55(val)
  val[0]
end

#_rule_56(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



594
595
596
# File 'lib/oga/xpath/parser.rb', line 594

def _rule_56(val)
  val[0]
end

#_rule_57(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



598
599
600
# File 'lib/oga/xpath/parser.rb', line 598

def _rule_57(val)
  val[0]
end

#_rule_58(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



602
603
604
# File 'lib/oga/xpath/parser.rb', line 602

def _rule_58(val)
  val[0]
end

#_rule_59(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



606
607
608
# File 'lib/oga/xpath/parser.rb', line 606

def _rule_59(val)
  val[0]
end

#_rule_6(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



332
333
334
# File 'lib/oga/xpath/parser.rb', line 332

def _rule_6(val)
   [:eq, val[1]] 
end

#_rule_60(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



610
611
612
# File 'lib/oga/xpath/parser.rb', line 610

def _rule_60(val)
  val[0]
end

#_rule_61(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



614
615
616
# File 'lib/oga/xpath/parser.rb', line 614

def _rule_61(val)
  val[0]
end

#_rule_62(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



618
619
620
# File 'lib/oga/xpath/parser.rb', line 618

def _rule_62(val)
  val[0]
end

#_rule_63(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



622
623
624
# File 'lib/oga/xpath/parser.rb', line 622

def _rule_63(val)
  val[0]
end

#_rule_64(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



626
627
628
# File 'lib/oga/xpath/parser.rb', line 626

def _rule_64(val)
  val[0]
end

#_rule_65(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



630
631
632
# File 'lib/oga/xpath/parser.rb', line 630

def _rule_65(val)
  val[0]
end

#_rule_66(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



634
635
636
# File 'lib/oga/xpath/parser.rb', line 634

def _rule_66(val)
  val[0]
end

#_rule_67(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



638
639
640
# File 'lib/oga/xpath/parser.rb', line 638

def _rule_67(val)
  val[0]
end

#_rule_68(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



642
643
644
# File 'lib/oga/xpath/parser.rb', line 642

def _rule_68(val)
  val[0]
end

#_rule_69(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



646
647
648
# File 'lib/oga/xpath/parser.rb', line 646

def _rule_69(val)
  val[0]
end

#_rule_7(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



336
337
338
# File 'lib/oga/xpath/parser.rb', line 336

def _rule_7(val)
   [:neq, val[1]] 
end

#_rule_8(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



340
341
342
# File 'lib/oga/xpath/parser.rb', line 340

def _rule_8(val)
   combine_operators(val) 
end

#_rule_9(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

API:

  • private



344
345
346
# File 'lib/oga/xpath/parser.rb', line 344

def _rule_9(val)
   [:lt, val[1]] 
end

#combine_operators(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Parameters:

API:

  • private



287
288
289
290
291
292
293
294
295
# File 'lib/oga/xpath/parser.rb', line 287

def combine_operators(val)
  ret = val[0]

  val[1].each do |expr|
    ret = s(expr[0], ret, expr[1])
  end

  ret
end

#combine_optional_operator(val) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Parameters:

API:

  • private



298
299
300
301
302
303
304
305
306
# File 'lib/oga/xpath/parser.rb', line 298

def combine_optional_operator(val)
  ret = val[0]

  if val[1]
    ret = s(val[1][0], ret, val[1][1])
  end

  ret
end

#each_token {|| ... } ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Yields the next token from the lexer.

Yield Parameters:

  • (Array)

API:

  • private



276
277
278
279
280
281
282
283
284
# File 'lib/oga/xpath/parser.rb', line 276

def each_token
  @lexer.advance do |type, value, line|
    @line = line if line

    yield [type, value]
  end

  yield [-1, -1]
end

#s(type, *children) ⇒ AST::Node

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Creates a new XPath node.

Parameters:

Returns:

API:

  • private



269
270
271
# File 'lib/oga/xpath/parser.rb', line 269

def s(type, *children)
  AST::Node.new(type, children)
end