2022/05/16

json で nom のお勉強

旧ブログの movable typemarkdown に変換したい。
nom でパースしようと思ったが Readme を読んでもいまいちしっくりこない。
parsec と同じようにはできませんか。
とりあえず練習がてら何かをパースしてみる。
仕様があるほうが嬉しいので探してみると json がよさそうだった。
まずは digits を書いてみた。
digit1 を使えば終わりなのだが、それでは練習にならないため定義通りに実装。

https://github.com/wat-aro/wjson

fn zero(input: &str) -> IResult<&str, u64> {
    map(char('0'), |c| c.to_string().parse::<u64>().unwrap())(input)
}

fn onenine(input: &str) -> IResult<&str, u64> {
    map(
        alt((
            char('1'),
            char('2'),
            char('3'),
            char('4'),
            char('5'),
            char('6'),
            char('7'),
            char('8'),
            char('9'),
        )),
        |c| c.to_string().parse::<u64>().unwrap(),
    )(input)
}

pub fn digit(input: &str) -> IResult<&str, u64> {
    alt((zero, onenine))(input)
}

pub fn digits(input: &str) -> IResult<&str, u64> {
    let (rest, v) = many1(digit)(input)?;
    let str_vec: String = v.iter().map(|d| d.to_string()).collect::<String>();

    Ok((rest, str_vec.parse().unwrap()))
}

まだ Rust を書き慣れていないけれど楽しい。


© 2022 wat-aro