llmaker 0.0.1

Make LL(1) token parser code for Rust.
use super::types;

pub fn make_parse_token_fn_str(setting: types::Setting) -> String {
  let (main_type_str, token_and_str_vec) = setting;
  token_and_str_vec_to_str(main_type_str, token_and_str_vec)
}

fn token_and_str_to_str(
  main_type_str: String,
  token_and_str: (types::Range, String, types::TypeStr),
) -> String {
  let (_, token_name, type_str) = token_and_str;
  format!(
    "
#[allow(non_camel_case_types)]
#[allow(non_snake_case)]
#[allow(unused_parens)]
#[allow(clippy::type_complexity)]
fn _parse_token_{}(
  tokens: &[{}],
  pos: usize,
) -> Result<({}, usize), ParseError>
{{
  let token1 = tokens.get(pos);
  token1
  .ok_or(ParseError::Eof)
  .and_then(|tok| match tok {{
    {} => Ok((tok.clone(), pos + 1)),
    _ => Err(ParseError::UnexpectedToken(tok.clone())),
  }})
}}
",
    token_name, main_type_str, main_type_str, type_str
  )
}

fn token_and_str_vec_to_str(
  main_type_str: String,
  token_and_str_vec: Vec<(types::Range, String, types::TypeStr)>,
) -> String {
  let mut main_s = String::new();
  for v in token_and_str_vec.iter() {
    let s = token_and_str_to_str(main_type_str.clone(), v.clone());
    main_s.push_str(&s)
  }
  main_s
}