diff options
| -rw-r--r-- | rust/Cargo.toml | 3 | ||||
| -rw-r--r-- | rust/src/lib.rs | 1 | ||||
| -rw-r--r-- | rust/src/reader.rs | 23 |
3 files changed, 20 insertions, 7 deletions
diff --git a/rust/Cargo.toml b/rust/Cargo.toml index c7c9519..da6cdb7 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -8,3 +8,6 @@ authors = [ "Your name <you@example.com>" ] time = "0.1" regex = "0.1" libc = "0.1" + +[dependencies.pcre] +git = "https://github.com/alexcrichton/rust-pcre" diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 63fab44..04eda85 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,6 +1,7 @@ #![feature(io, fs, core, std_misc, collections)] extern crate libc; +extern crate pcre; extern crate regex; extern crate time; diff --git a/rust/src/reader.rs b/rust/src/reader.rs index 94093db..4750c46 100644 --- a/rust/src/reader.rs +++ b/rust/src/reader.rs @@ -1,8 +1,8 @@ -use std::borrow::ToOwned; use types::MalError::{ErrString, ErrMalVal}; use types::{MalVal, MalRet, _nil, _true, _false, _int, symbol, string, list, vector, hash_mapv, err_str, err_string, err_val}; +use pcre::Pcre; use super::printer::unescape_str; #[derive(Debug, Clone)] @@ -31,12 +31,21 @@ impl Reader { fn tokenize(str: String) -> Vec<String> { let mut results = vec![]; - let re = regex!(r###"[\s,]*(~@|[\[\]{}()'`~^@]|"(?:\\.|[^\\"])*"|;.*|[^\s\[\]{}('"`,;)]*)"###); - for cap in re.captures_iter(&str) { - let group = cap.at(1).unwrap_or(""); - if group == "" { break; } - if group.starts_with(";") { continue; } - results.push(group.to_owned()); + + let re = match Pcre::compile(r###"[\s,]*(~@|[\[\]{}()'`~^@]|"(?:\\.|[^\\"])*"|;.*|[^\s\[\]{}('"`,;)]*)"###) { + Err(_) => { panic!("failed to compile regex") }, + Ok(re) => re + }; + + let mut it = re.matches(&str); + loop { + let opt_m = it.next(); + if opt_m.is_none() { break; } + let m = opt_m.unwrap(); + if m.group(1) == "" { break; } + if m.group(1).starts_with(";") { continue; } + + results.push((*m.group(1)).to_string()); } results } |
