book_keywords_permit/
book_keywords_permit.rs

1fn keyword(state: i32, ch: char) -> (bool, i32) {
2    match state {
3        0 if ch == '$' => (true, 1),
4        0 => (false, -1),
5        1 if ch.is_alphabetic() => (true, 2),
6        1 => (false, -1),
7        2 if ch.is_alphanumeric() => (true, 2),
8        2 if ch == '_' => (true, 3),
9        2 => (false, 0),
10        _ if ch.is_alphanumeric() => (true, 2),
11        _ if ch == '_' => (true, 3),
12        _ => (false, -1),
13    }
14}
15
16fn main() {
17    let mut parser = trivet::parse_from_stdin();
18    parser.borrow_keyword_parser().use_permit = true;
19    parser.borrow_keyword_parser().permit = Box::new(keyword);
20    while !parser.is_at_eof() {
21        match parser.parse_keyword_ws() {
22            Err(err) => {
23                println!("ERROR: {}", err);
24                // Consume until whitespace, then resume trying.
25                parser.take_while(|ch| !ch.is_whitespace());
26                parser.consume_ws();
27            }
28            Ok(value) => {
29                println!("  {}", value);
30            }
31        }
32    }
33}