@@ -107,6 +107,7 @@ pub struct Production {
107
107
pub symbols : Vec < Symbol > ,
108
108
pub precedence : Option < String > ,
109
109
pub action : Option < String > ,
110
+ pub prod_span : Span ,
110
111
}
111
112
112
113
#[ derive( Clone , Debug ) ]
@@ -185,12 +186,14 @@ impl GrammarAST {
185
186
symbols : Vec < Symbol > ,
186
187
precedence : Option < String > ,
187
188
action : Option < String > ,
189
+ prod_span : Span ,
188
190
) {
189
191
self . rules [ & rule_name] . pidxs . push ( self . prods . len ( ) ) ;
190
192
self . prods . push ( Production {
191
193
symbols,
192
194
precedence,
193
195
action,
196
+ prod_span,
194
197
} ) ;
195
198
}
196
199
@@ -436,7 +439,7 @@ mod test {
436
439
let empty_span = Span :: new ( 0 , 0 ) ;
437
440
grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
438
441
grm. add_rule ( ( "B" . to_string ( ) , empty_span) , None ) ;
439
- grm. add_prod ( "B" . to_string ( ) , vec ! [ ] , None , None ) ;
442
+ grm. add_prod ( "B" . to_string ( ) , vec ! [ ] , None , None , empty_span ) ;
440
443
match grm. complete_and_validate ( ) {
441
444
Err ( YaccGrammarError {
442
445
kind : YaccGrammarErrorKind :: InvalidStartRule ( _) ,
@@ -452,7 +455,7 @@ mod test {
452
455
let empty_span = Span :: new ( 0 , 0 ) ;
453
456
grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
454
457
grm. add_rule ( ( "A" . to_string ( ) , empty_span) , None ) ;
455
- grm. add_prod ( "A" . to_string ( ) , vec ! [ ] , None , None ) ;
458
+ grm. add_prod ( "A" . to_string ( ) , vec ! [ ] , None , None , empty_span ) ;
456
459
assert ! ( grm. complete_and_validate( ) . is_ok( ) ) ;
457
460
}
458
461
@@ -463,8 +466,8 @@ mod test {
463
466
grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
464
467
grm. add_rule ( ( "A" . to_string ( ) , empty_span) , None ) ;
465
468
grm. add_rule ( ( "B" . to_string ( ) , empty_span) , None ) ;
466
- grm. add_prod ( "A" . to_string ( ) , vec ! [ rule( "B" ) ] , None , None ) ;
467
- grm. add_prod ( "B" . to_string ( ) , vec ! [ ] , None , None ) ;
469
+ grm. add_prod ( "A" . to_string ( ) , vec ! [ rule( "B" ) ] , None , None , empty_span ) ;
470
+ grm. add_prod ( "B" . to_string ( ) , vec ! [ ] , None , None , empty_span ) ;
468
471
assert ! ( grm. complete_and_validate( ) . is_ok( ) ) ;
469
472
}
470
473
@@ -474,7 +477,7 @@ mod test {
474
477
let empty_span = Span :: new ( 0 , 0 ) ;
475
478
grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
476
479
grm. add_rule ( ( "A" . to_string ( ) , empty_span) , None ) ;
477
- grm. add_prod ( "A" . to_string ( ) , vec ! [ rule( "B" ) ] , None , None ) ;
480
+ grm. add_prod ( "A" . to_string ( ) , vec ! [ rule( "B" ) ] , None , None , empty_span ) ;
478
481
match grm. complete_and_validate ( ) {
479
482
Err ( YaccGrammarError {
480
483
kind : YaccGrammarErrorKind :: UnknownRuleRef ( _) ,
@@ -491,7 +494,7 @@ mod test {
491
494
grm. tokens . insert ( "b" . to_string ( ) ) ;
492
495
grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
493
496
grm. add_rule ( ( "A" . to_string ( ) , empty_span) , None ) ;
494
- grm. add_prod ( "A" . to_string ( ) , vec ! [ token( "b" ) ] , None , None ) ;
497
+ grm. add_prod ( "A" . to_string ( ) , vec ! [ token( "b" ) ] , None , None , empty_span ) ;
495
498
assert ! ( grm. complete_and_validate( ) . is_ok( ) ) ;
496
499
}
497
500
@@ -504,7 +507,7 @@ mod test {
504
507
grm. tokens . insert ( "b" . to_string ( ) ) ;
505
508
grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
506
509
grm. add_rule ( ( "A" . to_string ( ) , empty_span) , None ) ;
507
- grm. add_prod ( "A" . to_string ( ) , vec ! [ rule( "b" ) ] , None , None ) ;
510
+ grm. add_prod ( "A" . to_string ( ) , vec ! [ rule( "b" ) ] , None , None , empty_span ) ;
508
511
assert ! ( grm. complete_and_validate( ) . is_err( ) ) ;
509
512
}
510
513
@@ -514,7 +517,7 @@ mod test {
514
517
let empty_span = Span :: new ( 0 , 0 ) ;
515
518
grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
516
519
grm. add_rule ( ( "A" . to_string ( ) , empty_span) , None ) ;
517
- grm. add_prod ( "A" . to_string ( ) , vec ! [ token( "b" ) ] , None , None ) ;
520
+ grm. add_prod ( "A" . to_string ( ) , vec ! [ token( "b" ) ] , None , None , empty_span ) ;
518
521
match grm. complete_and_validate ( ) {
519
522
Err ( YaccGrammarError {
520
523
kind : YaccGrammarErrorKind :: UnknownToken ( _) ,
@@ -530,7 +533,13 @@ mod test {
530
533
let empty_span = Span :: new ( 0 , 0 ) ;
531
534
grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
532
535
grm. add_rule ( ( "A" . to_string ( ) , empty_span) , None ) ;
533
- grm. add_prod ( "A" . to_string ( ) , vec ! [ rule( "b" ) , token( "b" ) ] , None , None ) ;
536
+ grm. add_prod (
537
+ "A" . to_string ( ) ,
538
+ vec ! [ rule( "b" ) , token( "b" ) ] ,
539
+ None ,
540
+ None ,
541
+ Span :: new ( 0 , 2 ) ,
542
+ ) ;
534
543
match grm. complete_and_validate ( ) {
535
544
Err ( YaccGrammarError {
536
545
kind : YaccGrammarErrorKind :: UnknownRuleRef ( _) ,
@@ -546,7 +555,7 @@ mod test {
546
555
let empty_span = Span :: new ( 2 , 3 ) ;
547
556
grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
548
557
grm. add_rule ( ( "A" . to_string ( ) , empty_span) , None ) ;
549
- grm. add_prod ( "A" . to_string ( ) , vec ! [ ] , None , None ) ;
558
+ grm. add_prod ( "A" . to_string ( ) , vec ! [ ] , None , None , empty_span ) ;
550
559
grm. epp
551
560
. insert ( "k" . to_owned ( ) , ( empty_span, ( "v" . to_owned ( ) , empty_span) ) ) ;
552
561
match grm. complete_and_validate ( ) {
@@ -580,6 +589,7 @@ mod test {
580
589
vec ! [ token( "b" ) ] ,
581
590
Some ( "b" . to_string ( ) ) ,
582
591
None ,
592
+ empty_span,
583
593
) ;
584
594
assert ! ( grm. complete_and_validate( ) . is_ok( ) ) ;
585
595
}
@@ -595,6 +605,7 @@ mod test {
595
605
vec ! [ token( "b" ) ] ,
596
606
Some ( "b" . to_string ( ) ) ,
597
607
None ,
608
+ empty_span,
598
609
) ;
599
610
match grm. complete_and_validate ( ) {
600
611
Err ( YaccGrammarError {
@@ -619,11 +630,11 @@ mod test {
619
630
let empty_span = Span :: new ( 0 , 0 ) ;
620
631
grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
621
632
grm. add_rule ( ( "A" . to_string ( ) , empty_span) , None ) ;
622
- grm. add_prod ( "A" . to_string ( ) , vec ! [ ] , None , None ) ;
633
+ grm. add_prod ( "A" . to_string ( ) , vec ! [ ] , None , None , empty_span ) ;
623
634
grm. tokens . insert ( "b" . to_string ( ) ) ;
624
635
grm. spans . push ( Span :: new ( 4 , 5 ) ) ;
625
636
grm. add_rule ( ( "B" . to_string ( ) , Span :: new ( 1 , 2 ) ) , None ) ;
626
- grm. add_prod ( "B" . to_string ( ) , vec ! [ token( "b" ) ] , None , None ) ;
637
+ grm. add_prod ( "B" . to_string ( ) , vec ! [ token( "b" ) ] , None , None , empty_span ) ;
627
638
628
639
assert_eq ! (
629
640
grm. unused_symbols( )
0 commit comments