Skip to content

Commit

Permalink
Add a test case for issue softdevteam#290
Browse files Browse the repository at this point in the history
  • Loading branch information
ratmice committed Aug 17, 2022
1 parent 6b011af commit 606d3a4
Showing 1 changed file with 68 additions and 0 deletions.
68 changes: 68 additions & 0 deletions nimbleparse/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -229,3 +229,71 @@ fn main() {
process::exit(1);
}
}

#[cfg(test)]
mod test {
use cfgrammar::{
yacc::{YaccGrammar, YaccKind, YaccOriginalActionKind},
RIdx, Span,
};
use lrlex::{DefaultLexeme, LRNonStreamingLexerDef, LexerDef};
use lrpar::{parser::AStackType, RTParserBuilder, lex_api::NonStreamingLexer};
use num_traits::ToPrimitive;
use std::sync::atomic::{AtomicU8, Ordering};

static COUNT: AtomicU8 = AtomicU8::new(0);

type TestAction<'a> = &'a dyn Fn(
RIdx<u32>,
&dyn NonStreamingLexer<DefaultLexeme, u32>,
Span,
std::vec::Drain<AStackType<DefaultLexeme, ()>>,
(),
);

fn test_action(
_ridx: RIdx<u32>,
_lexer: &dyn NonStreamingLexer<DefaultLexeme, u32>,
_span: Span,
_astack: std::vec::Drain<AStackType<DefaultLexeme, ()>>,
_param: (),
) {
let x = COUNT.load(Ordering::SeqCst);
if x < std::u8::MAX {
COUNT.store(x + 1, Ordering::SeqCst);
} else {
panic!("actions executed too many times")
}
}

#[test]
fn nefarious_recursive_rule() {
let mut lexerdef = LRNonStreamingLexerDef::<DefaultLexeme, u32>::from_str(
r"
%%
a 'a'
[\t\n ] ;",
)
.unwrap();
let grm = YaccGrammar::new(
YaccKind::Original(YaccOriginalActionKind::NoAction),
r"%%
Start: Bar;
Foo: 'a' | ;
Bar: Foo | Foo Bar;",
)
.unwrap();
let (_, state_tbl) = lrtable::from_yacc(&grm, lrtable::Minimiser::Pager).unwrap();
let rule_ids = grm
.tokens_map()
.iter()
.map(|(&n, &i)| (n, usize::from(i).to_u32().unwrap()))
.collect();
lexerdef.set_rule_ids(&rule_ids);
let lexer = lexerdef.lexer("a");
let pb = RTParserBuilder::new(&grm, &state_tbl);
let actions: &[TestAction] = &[&test_action, &test_action, &test_action];
pb.parse_actions(&lexer, actions, ());
pb.parse_generictree(&lexer);
}
}

0 comments on commit 606d3a4

Please sign in to comment.