@@ -107,6 +107,7 @@ pub struct Production {
107107 pub symbols : Vec < Symbol > ,
108108 pub precedence : Option < String > ,
109109 pub action : Option < String > ,
110+ pub prod_span : Span ,
110111}
111112
112113#[ derive( Clone , Debug ) ]
@@ -185,12 +186,14 @@ impl GrammarAST {
185186 symbols : Vec < Symbol > ,
186187 precedence : Option < String > ,
187188 action : Option < String > ,
189+ prod_span : Span ,
188190 ) {
189191 self . rules [ & rule_name] . pidxs . push ( self . prods . len ( ) ) ;
190192 self . prods . push ( Production {
191193 symbols,
192194 precedence,
193195 action,
196+ prod_span,
194197 } ) ;
195198 }
196199
@@ -436,7 +439,7 @@ mod test {
436439 let empty_span = Span :: new ( 0 , 0 ) ;
437440 grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
438441 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 ) ;
440443 match grm. complete_and_validate ( ) {
441444 Err ( YaccGrammarError {
442445 kind : YaccGrammarErrorKind :: InvalidStartRule ( _) ,
@@ -452,7 +455,7 @@ mod test {
452455 let empty_span = Span :: new ( 0 , 0 ) ;
453456 grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
454457 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 ) ;
456459 assert ! ( grm. complete_and_validate( ) . is_ok( ) ) ;
457460 }
458461
@@ -463,8 +466,8 @@ mod test {
463466 grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
464467 grm. add_rule ( ( "A" . to_string ( ) , empty_span) , None ) ;
465468 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 ) ;
468471 assert ! ( grm. complete_and_validate( ) . is_ok( ) ) ;
469472 }
470473
@@ -474,7 +477,7 @@ mod test {
474477 let empty_span = Span :: new ( 0 , 0 ) ;
475478 grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
476479 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 ) ;
478481 match grm. complete_and_validate ( ) {
479482 Err ( YaccGrammarError {
480483 kind : YaccGrammarErrorKind :: UnknownRuleRef ( _) ,
@@ -491,7 +494,7 @@ mod test {
491494 grm. tokens . insert ( "b" . to_string ( ) ) ;
492495 grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
493496 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 ) ;
495498 assert ! ( grm. complete_and_validate( ) . is_ok( ) ) ;
496499 }
497500
@@ -504,7 +507,7 @@ mod test {
504507 grm. tokens . insert ( "b" . to_string ( ) ) ;
505508 grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
506509 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 ) ;
508511 assert ! ( grm. complete_and_validate( ) . is_err( ) ) ;
509512 }
510513
@@ -514,7 +517,7 @@ mod test {
514517 let empty_span = Span :: new ( 0 , 0 ) ;
515518 grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
516519 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 ) ;
518521 match grm. complete_and_validate ( ) {
519522 Err ( YaccGrammarError {
520523 kind : YaccGrammarErrorKind :: UnknownToken ( _) ,
@@ -530,7 +533,13 @@ mod test {
530533 let empty_span = Span :: new ( 0 , 0 ) ;
531534 grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
532535 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+ ) ;
534543 match grm. complete_and_validate ( ) {
535544 Err ( YaccGrammarError {
536545 kind : YaccGrammarErrorKind :: UnknownRuleRef ( _) ,
@@ -546,7 +555,7 @@ mod test {
546555 let empty_span = Span :: new ( 2 , 3 ) ;
547556 grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
548557 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 ) ;
550559 grm. epp
551560 . insert ( "k" . to_owned ( ) , ( empty_span, ( "v" . to_owned ( ) , empty_span) ) ) ;
552561 match grm. complete_and_validate ( ) {
@@ -580,6 +589,7 @@ mod test {
580589 vec ! [ token( "b" ) ] ,
581590 Some ( "b" . to_string ( ) ) ,
582591 None ,
592+ empty_span,
583593 ) ;
584594 assert ! ( grm. complete_and_validate( ) . is_ok( ) ) ;
585595 }
@@ -595,6 +605,7 @@ mod test {
595605 vec ! [ token( "b" ) ] ,
596606 Some ( "b" . to_string ( ) ) ,
597607 None ,
608+ empty_span,
598609 ) ;
599610 match grm. complete_and_validate ( ) {
600611 Err ( YaccGrammarError {
@@ -619,11 +630,11 @@ mod test {
619630 let empty_span = Span :: new ( 0 , 0 ) ;
620631 grm. start = Some ( ( "A" . to_string ( ) , empty_span) ) ;
621632 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 ) ;
623634 grm. tokens . insert ( "b" . to_string ( ) ) ;
624635 grm. spans . push ( Span :: new ( 4 , 5 ) ) ;
625636 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 ) ;
627638
628639 assert_eq ! (
629640 grm. unused_symbols( )
0 commit comments