-
Notifications
You must be signed in to change notification settings - Fork 835
Closed
Description
I am exploring the possibility of switching to nom
in a project I am working on. I am not fully familiar with nom
yet, so please bear with me.
For starters, I was trying to come up with a parser that matches strings of the form [a-zA-Z][-a-zA-Z0-9_]*
. I wrote this:
#[macro_use]
extern crate nom;
use std::str::from_utf8;
use nom::{alpha, alphanumeric};
use nom::{IResult, Needed};
use nom::IResult::*;
named!(identifier<&[u8], String>,
chain!(
h: map_res!(alpha, from_utf8) ~
t: many0!(alt!(alphanumeric | tag!("-") | tag!("_"))),
|| {
let s = h.to_string();
t.into_iter().fold(s, |mut accum, slice| {
accum.push_str(from_utf8(slice).unwrap()); accum })}));
And I tested it with:
#[test]
fn id_name() {
let a_setting = &b"miles"[..];
let res = setting_name(a_setting);
assert_eq!(res, Done(&b""[..], "miles".to_string()));
}
When I run cargo test
my PC completely hangs. With top
I can see that it starts consuming more and more CPU and memory until the entire system is completely unusable and I have to hard reset.
Am I doing something wrong? Is this the best way to make a parser to match this type of strings?
Metadata
Metadata
Assignees
Labels
No labels