Skip to content

Commit ea448ef

Browse files
authored
Merge pull request #537 from ratmice/issue_473_assertion_take2
Issue 473 using a span on Production.
2 parents a14ad77 + d1ff8d9 commit ea448ef

File tree

3 files changed

+158
-47
lines changed

3 files changed

+158
-47
lines changed

cfgrammar/src/lib/yacc/ast.rs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)