#![allow(clippy::print_stdout, clippy::print_stderr)]
use bnf::{Grammar, Term};
fn main() {
let bnf_input = r#"
<base> ::= 'A' | 'C' | 'G' | 'T'
<dna> ::= <base> | <base> <dna>
"#;
let grammar: Grammar = match bnf_input.parse() {
Ok(g) => g,
Err(e) => {
eprintln!("Failed to create grammar from BNF string: {e}");
return;
}
};
let parser = match grammar.build_parser() {
Ok(p) => p,
Err(e) => {
eprintln!("Failed to create parser: {e}");
return;
}
};
let sentence = "GATTACA";
println!("Parsing input with <dna>: {sentence}");
let target_production = Term::Nonterminal("dna".to_string());
let mut parse_trees = parser.parse_input_starting_with(sentence, &target_production);
match parse_trees.next() {
Some(parse_tree) => {
println!("Parse tree:\n{parse_tree}");
}
None => {
println!("Grammar could not parse the sentence");
}
}
}