use std::io::{self, Read, ErrorKind};
use std::ffi::OsString;
use std::fs::File;
use std::collections::HashSet;
use std::fmt;
use std::str;
pub mod options;
pub use self::options::{Opts};
pub mod error;
pub use self::error::*;
pub type ParseResult<T> = Result<T, ParseError>;
#[derive(Debug, Clone, Copy)]
pub struct Cursor {
buf: usize,
pos: usize,
pub stream: u64,
pub line: u64,
pub lpos: u64,
}
impl fmt::Display for Cursor {
fn fmt(&self, f: &mut fmt::Formatter) -> Result <(), fmt::Error> {
write!(f, "absolute position {}, line {}, position {}",
self.stream, self.line, self.lpos)
}
}
type Buf = Vec<u8>;
#[derive(Debug, Clone, Copy)]
struct BufState {
valid: bool,
size: usize,
}
pub struct Stream<'a, R: Read> {
reader: &'a mut R,
bufs: Vec<Buf>,
states: Vec<BufState>,
cur: Cursor,
opts: Opts,
inited: bool,
white_space: HashSet<u8>,
}
pub fn parse_file<F, T>(f: OsString, opts: Opts, parse: F) -> ParseResult<T>
where F: Fn(&mut Stream<File>) -> ParseResult<T>
{
match File::open(f) {
Ok(mut input) => {
let mut s = Stream::new(opts, &mut input);
return parse(&mut s);
},
Err(e) => return Err(ParseError::IOError(e)),
}
}
pub fn parse_string<F, T>(s: String, opts: Opts, parse: F) -> ParseResult<T>
where F: Fn(&mut Stream<io::Cursor<Vec<u8>>>) -> ParseResult<T>
{
let mut input = io::Cursor::new(s.as_bytes().to_vec());
let mut p = Stream::new(opts, &mut input);
parse(&mut p)
}
pub fn parse_buffer<F, T>(buf: &[u8], opts: Opts, parse: F) -> ParseResult<T>
where F: Fn(&mut Stream<io::Cursor<Vec<u8>>>) -> ParseResult<T>
{
let mut input = io::Cursor::new(buf.to_vec());
let mut p = Stream::new(opts, &mut input);
parse(&mut p)
}
impl<'a, R: Read> Stream<'a, R> {
pub fn new(opts: Opts, reader: &'a mut R) -> Stream<R> {
let mut buf = Vec::with_capacity(opts.buf_num);
for _ in 0..opts.buf_num {
buf.push(vec!(0; opts.buf_size));
}
let mut states = Vec::with_capacity(opts.buf_num);
for _ in 0 .. opts.buf_num {
states.push(BufState {
valid: false,
size: opts.buf_size,
});
}
Stream {
reader: reader,
bufs: buf,
states: states,
opts: opts,
inited: false,
white_space: HashSet::from([b' ', b'\n', b'\r', b'\t']),
cur: Cursor {
buf: 0,
pos: 0,
stream: 0,
line: 1,
lpos: 1,
}
}
}
fn init(&mut self) -> ParseResult<()> {
self.opts.validate()?;
for i in 1..self.opts.buf_num {
self.states[i].valid = false;
self.states[i].size = self.opts.buf_size;
}
self.cur.stream = 0;
self.cur.line = 0;
self.cur.lpos = 0;
self.cur.buf = 0;
self.cur.pos = 0;
self.fill_buf(0, 0)?;
if self.states[0].size > 0 {
self.states[0].valid = true;
}
self.inited = true;
Ok(())
}
pub fn buf_size(self) -> usize {
self.opts.buf_size
}
pub fn buf_num(self) -> usize {
self.opts.buf_num
}
pub fn max_stream(self) -> u64 {
self.opts.max_stream
}
pub fn set_whitespace(&mut self, w: &[u8]) {
self.white_space = w.to_vec().into_iter().collect();
}
pub fn position(&self) -> Cursor {
self.cur
}
pub fn count_lines(&mut self) {
self.cur.line += 1;
self.cur.lpos = 1;
}
fn advance_this(&self, cur: &mut Cursor, n: usize) {
cur.pos += n;
cur.buf = if cur.pos >= self.opts.buf_size {
let m = cur.pos / self.opts.buf_size;
(cur.buf + m) % self.opts.buf_num
} else {
cur.buf
};
cur.pos %= self.opts.buf_size;
cur.stream += n as u64;
cur.lpos += n as u64;
}
fn advance(&mut self, n: usize) {
let mut cur = self.cur;
self.advance_this(&mut cur, n);
self.cur.buf = cur.buf;
self.cur.pos = cur.pos;
self.cur.stream = cur.stream;
self.cur.line = cur.line;
self.cur.lpos = cur.lpos;
}
fn reset_cur(&mut self, cur: Cursor) {
self.cur.buf = cur.buf;
self.cur.pos = cur.pos;
self.cur.stream = cur.stream;
self.cur.line = cur.line;
self.cur.lpos = cur.lpos;
self.states[cur.buf].valid = true;
}
fn resettable(&self, cur: Cursor) -> bool {
let d = if self.cur.buf > cur.buf {
self.cur.buf - cur.buf
} else {
cur.buf - self.cur.buf
};
d < (self.opts.buf_num - 1)
}
fn fill_buf(&mut self, n: usize, wanted: usize) -> ParseResult<()> {
let mut s = if self.states[n].size < self.opts.buf_size {
self.states[n].size
} else {
0
};
let buf = &mut self.bufs[n][..];
loop {
match self.reader.read(&mut buf[s..]) {
Ok(0) => {
self.states[n].size = s;
},
Ok(x) => {
s += x;
self.states[n].size = s;
if s < self.opts.buf_size {
if wanted > 0 && s < wanted {
continue;
}
}
},
Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
Err(e) => return Err(ParseError::IOError(e)),
};
break;
}
Ok(())
}
fn bytes_to_read_from_buf(&self, buf: usize, n: usize) -> usize {
if self.states[buf].size == self.opts.buf_size {
if n > self.opts.buf_size {
return self.opts.buf_size;
} else {
return n;
}
} else {
let d = self.opts.buf_size - self.states[buf].size;
if n > d {
return d;
} else {
return n;
}
}
}
fn bytes_needed(&self, n: usize) -> usize {
let mut r = n;
for i in 0 .. self.opts.buf_num {
let j = (self.cur.buf + i)%self.opts.buf_num;
if !self.states[j].valid {
break;
}
let s = if j == self.cur.buf {
if self.cur.pos >= self.states[j].size {
0
} else {
self.states[j].size - self.cur.pos
}
} else {
self.states[j].size
};
if r > s {
r -= s;
} else {
r = 0;
break;
}
}
if r == 0 && !self.states[self.cur.buf].valid {
r = 1;
}
r
}
fn consume(&mut self, n: usize) -> ParseResult<Cursor> {
if !self.inited {
self.init()?;
}
if !self.states[self.cur.buf].valid || self.cur.pos + n >= self.states[self.cur.buf].size {
let mut r = self.bytes_needed(n);
if n >= self.opts.buf_num * self.opts.buf_size - self.opts.buf_size {
return Err(err_exceeds_buffers(self.cur, n/self.opts.buf_num, self.opts.buf_num));
}
let offset = if self.states[self.cur.buf].valid && self.states[self.cur.buf].size == self.opts.buf_size {
1
} else {
0
};
for i in 0 .. self.opts.buf_num {
if r == 0 {
break;
}
let j = (self.cur.buf + i + offset)%self.opts.buf_num;
let wanted = self.bytes_to_read_from_buf(j, r);
if self.states[j].size < self.opts.buf_size || !self.states[j].valid {
let d = if self.states[j].valid {
self.states[j].size
} else {
0
};
self.fill_buf(j, wanted)?;
if self.states[j].size > 0 {
self.states[j].valid = true;
if r > self.states[j].size - d {
r -= self.states[j].size - d;
} else {
r = 0;
}
}
}
}
}
let cur = self.cur;
self.advance(n);
if self.cur.pos > self.states[self.cur.buf].size {
if self.resettable(cur) {
self.reset_cur(cur);
}
return Err(err_eof(self.cur));
}
if cur.buf != self.cur.buf {
self.states[cur.buf].valid = false;
}
Ok(cur)
}
fn get(&self, cur: Cursor) -> u8 {
self.bufs[cur.buf][cur.pos]
}
fn get_many(&self, cur: Cursor, size: usize, target: &mut [u8]) {
let mut pos = cur.pos;
let mut buf = cur.buf;
for i in 0..size {
target[i] = self.bufs[buf][pos];
pos += 1;
if pos >= self.states[buf].size {
buf = (buf + 1) % self.opts.buf_num;
pos = 0;
}
}
}
fn check_excess(&self, n: usize) -> ParseResult<()> {
if n / self.opts.buf_size >= self.opts.buf_num - 1 {
return Err(err_exceeds_buffers(
self.cur,
self.opts.buf_num,
self.opts.buf_num - 1)
);
}
Ok(())
}
pub fn succeed(&mut self) -> ParseResult<()> {
Ok(())
}
pub fn fail<T>(&mut self, msg: &str, _dummy: T) -> ParseResult<T> {
Err(ParseError::Failed(msg.to_string(), self.cur))
}
pub fn eof(&mut self) -> ParseResult<()> {
match self.consume(1) {
Ok(cur) => {
self.reset_cur(cur);
return Err(err_not_eof(self.cur));
},
Err(ParseError::Failed(s, _)) if s == "end of file" => return Ok(()),
Err(e) => return Err(e),
}
}
pub fn byte(&mut self, ch: u8) -> ParseResult<()> {
let cur = self.consume(1)?;
let b = self.get(cur);
if b != ch {
self.reset_cur(cur);
return Err(err_expected_byte(self.cur, ch, b));
}
Ok(())
}
pub fn one_of_bytes(&mut self, bs: &[u8]) -> ParseResult<()> {
let x = self.peek_byte()?;
for b in bs {
if x == *b {
self.byte(x)?;
return Ok(());
}
}
Err(err_expected_one_of_bytes(self.cur, bs, x))
}
pub fn bytes(&mut self, pattern: &[u8]) -> ParseResult<()> {
let n = pattern.len();
self.check_excess(n)?;
let mut cur = self.cur;
let sav = cur;
self.consume(n)?;
for c in pattern {
let b = self.get(cur);
if *c != b {
self.reset_cur(sav);
return Err(err_expected_byte(self.cur, *c, b));
}
self.advance_this(&mut cur, 1);
}
Ok(())
}
pub fn any_byte(&mut self) -> ParseResult<u8> {
let cur = self.consume(1)?;
let ch = self.get(cur);
Ok(ch)
}
pub fn get_bytes(&mut self, n: usize) -> ParseResult<Vec<u8>> {
self.check_excess(n)?;
let mut cur = self.cur;
self.consume(n)?;
let mut v = Vec::with_capacity(n);
for _ in 0..n {
v.push(self.get(cur));
self.advance_this(&mut cur, 1);
}
Ok(v)
}
pub fn character(&mut self, ch: char) -> ParseResult<()> {
let mut b1 = [0; 4];
let mut b2 = [0; 4];
let n = ch.encode_utf8(&mut b1).len();
let cur = self.consume(n)?;
self.get_many(cur, n, &mut b2);
let s = match str::from_utf8(&b2[..n]) {
Ok(s) => s,
Err(_) => {
self.reset_cur(cur);
return Err(err_expected_char(self.cur, ch, &b2));
},
};
let c2 = match s.chars().nth(0) {
Some(c) => c,
None => return Err(err_expected_char(self.cur, ch, &b2)),
};
if ch != c2 {
self.reset_cur(cur);
return Err(err_expected_char(self.cur, ch, &b2));
}
Ok(())
}
pub fn one_of_chars(&mut self, cs: &[char]) -> ParseResult<()> {
let x = self.peek_character()?;
for c in cs {
if x == *c {
self.character(x)?;
return Ok(());
}
}
Err(err_expected_one_of_chars(self.cur, cs, x))
}
fn len_of_char(&self, b: u8) -> usize {
if b & (1 << 7) == 0 {
return 1;
}
if b & (1 << 6) == 0 {
return 0;
}
if b & (1 << 5) == 0 {
return 2;
}
if b & (1 << 4) == 0 {
return 3;
}
if b & (1 << 3) == 0 {
return 4;
}
0
}
pub fn any_character(&mut self) -> ParseResult<char> {
let mut bs = [0; 4];
let cur = self.consume(1)?;
let sav = cur;
bs[0] = self.get(cur);
let n = self.len_of_char(bs[0]);
if n == 0 {
self.reset_cur(cur);
return Err(err_utf8_error(cur, bs.to_vec()));
}
if n == 1 {
return Ok(bs[0] as char);
}
for i in 0 .. (n-1) {
let cur = match self.consume(1) {
Ok(cur) => cur,
Err(_) => {
self.reset_cur(sav);
return Err(err_utf8_error(cur, bs.to_vec()));
},
};
bs[i+1] = self.get(cur);
}
match str::from_utf8(&bs) {
Ok(x) => {
return Ok(x.chars().collect::<Vec<char>>()[0]);
},
Err(_) => {
if self.resettable(sav) {
self.reset_cur(sav);
}
return Err(err_utf8_error(cur, bs.to_vec()));
},
}
}
pub fn digit(&mut self) -> ParseResult<u8> {
let cur = self.consume(1)?;
let ch = self.get(cur);
if ch < 48 || ch > 57 {
self.reset_cur(cur);
return Err(err_not_a_digit(self.cur, ch));
}
Ok(ch)
}
pub fn digits(&mut self) -> ParseResult<Vec<u8>> {
let mut first = true;
let mut v = Vec::new();
loop {
let cur = match self.consume(1) {
Ok(c) => c,
Err(ParseError::Failed(s, _)) if !first && s == "end of file" => break,
Err(e) => return Err(e),
};
let ch = self.get(cur);
if ch < 48 || ch > 57 {
self.reset_cur(cur);
if first {
return Err(err_not_a_digit(self.cur, ch));
}
break;
}
first = false;
v.push(ch);
}
Ok(v)
}
pub fn whitespace(&mut self) -> ParseResult<()> {
let mut first = true;
loop {
let cur = match self.consume(1) {
Ok(c) => c,
Err(ParseError::Failed(s, _)) if !first && s == "end of file" => return Ok(()),
Err(e) => return Err(e),
};
let ch = self.get(cur);
match self.white_space.get(&ch) {
None => {
self.reset_cur(cur);
if first {
return Err(err_expected_whitespace(self.cur, ch));
}
break;
},
Some(_) => if first {
first = false;
},
}
if ch == b'\n' {
self.cur.line += 1;
self.cur.lpos = 1;
}
}
Ok(())
}
pub fn skip_whitespace(&mut self) -> ParseResult<()> {
let _ = self.whitespace();
Ok(())
}
pub fn string(&mut self, pattern: &str) -> ParseResult<()> {
let n = pattern.len();
self.check_excess(n)?;
let cur = self.cur;
let s = self.get_string(n)?;
if s != pattern {
self.reset_cur(cur);
return Err(err_expected_string(self.cur, pattern, &s));
}
Ok(())
}
pub fn string_ic(&mut self, pattern: &str) -> ParseResult<()> {
let n = pattern.len();
self.check_excess(n)?;
let cur = self.cur;
let s = self.get_string(n)?;
if s.to_uppercase() != pattern.to_uppercase() {
self.reset_cur(cur);
return Err(err_expected_string(self.cur, pattern, &s));
}
Ok(())
}
pub fn one_of_strings(&mut self, vs: &[&str]) -> ParseResult<()> {
for b in vs {
match self.string(*b) {
Ok(()) => return Ok(()),
Err(ParseError::Failed(x, _)) => match x.strip_prefix("expected string:") {
Some(_) => continue,
None => return Err(ParseError::Failed(x, self.cur)),
}
Err(e) => return Err(e),
}
}
Err(err_expected_one_of_strings(self.cur, vs))
}
pub fn one_of_strings_ic(&mut self, bs: &[&str]) -> ParseResult<()> {
for b in bs {
match self.string_ic(*b) {
Ok(()) => return Ok(()),
Err(ParseError::Failed(x, _)) => match x.strip_prefix("expected string:") {
Some(_) => continue,
None => return Err(ParseError::Failed(x, self.cur)),
}
Err(e) => return Err(e),
}
}
Err(err_expected_one_of_strings(self.cur, bs))
}
pub fn get_string(&mut self, n: usize) -> ParseResult<String> {
self.check_excess(n)?;
let cur = self.cur;
let v = self.get_bytes(n)?;
match str::from_utf8(&v) {
Ok(s) => return Ok(s.to_string()),
Err(std::str::Utf8Error{..}) => {
self.reset_cur(cur);
return Err(err_utf8_error(self.cur, v));
},
}
}
fn copy_from_bufs(&mut self, buf: &mut Vec<u8>) -> ParseResult<usize> {
let l = buf.len();
let mut s = 0;
let mut p = self.cur.pos;
let mut x = self.cur.buf;
for i in 0 .. l {
if p >= self.states[x].size {
x += 1;
x %= self.opts.buf_num;
if !self.states[x].valid {
break;
}
p = 0;
}
buf[i] = self.bufs[x][p];
p += 1;
s += 1;
}
Ok(s)
}
pub fn blob(&mut self, buf: &mut Vec<u8>) -> ParseResult<usize> {
let l = buf.len();
if !self.inited {
self.init()?;
}
let mut s = self.copy_from_bufs(buf)?;
while s < l {
match self.reader.read(&mut buf[s..]) {
Ok(0) => return Ok(0),
Ok(x) => s += x,
Err(ref e) if e.kind() == ErrorKind::Interrupted => continue,
Err(e) => return Err(ParseError::IOError(e)),
};
}
self.init()?;
self.cur.pos = 0;
self.cur.buf = 0;
Ok(s)
}
pub fn drain(&mut self) -> ParseResult<Vec<u8>> {
let mut v = Vec::new();
if !self.inited {
return Ok(v);
}
let mut p = self.cur.pos;
let mut x = self.cur.buf;
loop {
if p < self.states[x].size {
v.extend_from_slice(&self.bufs[x][p..]);
}
self.states[x].valid = false;
x += 1;
x %= self.opts.buf_num;
if !self.states[x].valid {
break;
}
p = 0;
}
self.cur.pos = 0;
self.cur.buf = 0;
Ok(v)
}
pub fn peek_byte(&mut self) -> ParseResult<u8> {
let cur = self.consume(1)?;
let ch = self.get(cur);
self.reset_cur(cur);
Ok(ch)
}
pub fn peek_bytes(&mut self, n: usize) -> ParseResult<Vec<u8>> {
self.check_excess(n)?;
let mut cur = self.consume(n)?;
let sav = cur;
let mut v = Vec::with_capacity(n);
for _ in 0 .. n {
v.push(self.get(cur));
self.advance_this(&mut cur, 1);
}
self.reset_cur(sav);
Ok(v)
}
pub fn peek_character(&mut self) -> ParseResult<char> {
let cur = self.cur;
match self.any_character() {
Ok(ch) => {
self.reset_cur(cur);
return Ok(ch);
},
Err(e) => {
self.reset_cur(cur);
return Err(e);
},
}
}
pub fn peek_characters(&mut self, n: usize) -> ParseResult<Vec<char>> {
self.check_excess(4*n)?;
let sav = self.cur;
let mut v = Vec::new();
for _ in 0 .. n {
match self.any_character() {
Ok(ch) => v.push(ch),
Err(e) => {
self.reset_cur(sav);
return Err(e);
},
}
}
self.reset_cur(sav);
Ok(v)
}
pub fn apply<T, F>(&mut self, parse: F) -> ParseResult<T>
where F: Fn(&mut Stream<R>) -> ParseResult<T>
{
parse(self)
}
pub fn optional<T, F>(&mut self, parse: F) -> ParseResult<Option<T>>
where F: Fn(&mut Stream<R>) -> ParseResult<T>
{
let cur = self.cur;
match parse(self) {
Ok(t) => return Ok(Some(t)),
Err(e) => {
if self.resettable(cur) {
self.reset_cur(cur);
} else {
return Err(err_fatal(e));
}
return Ok(None);
},
}
}
pub fn choice<T, F>(&mut self, parsers: &[F]) -> ParseResult<T>
where F: Fn(&mut Stream<R>) -> ParseResult<T>
{
let mut v: Vec<Box<ParseError>> = Vec::new();
let cur = self.cur;
for p in parsers {
match p(self) {
Ok(t) => return Ok(t),
Err(e) =>
if self.resettable(cur) {
self.reset_cur(cur);
v.push(Box::new(e));
} else {
return Err(err_fatal(e));
},
}
}
Err(err_all_failed(self.cur, v))
}
pub fn between<T, F1, F2, F3>(&mut self,
before: F1,
parse: F2,
after: F3) -> ParseResult<T>
where F1: Fn(&mut Stream<R>) -> ParseResult<()>,
F2: Fn(&mut Stream<R>) -> ParseResult<T>,
F3: Fn(&mut Stream<R>) -> ParseResult<()>
{
before(self)?;
let r = parse(self)?;
after(self)?;
Ok(r)
}
pub fn many<T, F>(&mut self, parse: F) -> ParseResult<Vec<T>>
where F: Fn(&mut Stream<R>) -> ParseResult<T>
{
let mut v = Vec::new();
loop {
let cur = self.cur;
match parse(self) {
Ok(t) => v.push(t),
Err(e) => {
if self.resettable(cur) {
self.reset_cur(cur);
} else {
return Err(err_fatal(e));
}
break;
},
}
}
Ok(v)
}
pub fn many_one<T, F>(&mut self, parse: F) -> ParseResult<Vec<T>>
where F: Fn(&mut Stream<R>) -> ParseResult<T>
{
let mut first = true;
let mut v = Vec::new();
loop {
let cur = self.cur;
match parse(self) {
Ok(t) => {
v.push(t);
first = false;
},
Err(e) if first => return Err(e),
Err(e) => {
if self.resettable(cur) {
self.reset_cur(cur);
} else {
return Err(err_fatal(e));
}
break;
},
}
}
Ok(v)
}
pub fn until<T, F1, F2>(&mut self, parse: F1, stopper: F2) -> ParseResult<Vec<T>>
where F1: Fn(&mut Stream<R>) -> ParseResult<T>,
F2: Fn(&mut Stream<R>) -> ParseResult<()>
{
let mut v = Vec::new();
loop {
let cur = self.cur;
match stopper(self) {
Ok(()) => break,
Err(e) => {
if self.resettable(cur) {
self.reset_cur(cur);
} else {
return Err(err_fatal(e));
}
let t = parse(self)?;
v.push(t);
}
}
}
Ok(v)
}
pub fn sep_by<T, F1, F2>(&mut self, parse: F1, sep: F2) -> ParseResult<Vec<T>>
where F1: Fn(&mut Stream<R>) -> ParseResult<T>,
F2: Fn(&mut Stream<R>) -> ParseResult<()>
{
let mut first = true;
let mut v = Vec::new();
let cur = self.cur;
loop {
match parse(self) {
Ok(t) => {
if first {
first = false;
}
v.push(t);
}
Err(e) => {
if self.resettable(cur) {
self.reset_cur(cur);
} else {
return Err(err_fatal(e));
}
if first {
break;
}
return Err(e);
},
}
let cur2 = self.cur;
match sep(self) {
Ok(()) => continue,
Err(e) => {
if self.resettable(cur2) {
self.reset_cur(cur2);
} else {
return Err(err_fatal(e));
}
break;
},
}
}
Ok(v)
}
pub fn sep_by_one<T, F1, F2>(&mut self, parse: F1, sep: F2) -> ParseResult<Vec<T>>
where F1: Fn(&mut Stream<R>) -> ParseResult<T>,
F2: Fn(&mut Stream<R>) -> ParseResult<()>
{
let mut v = Vec::new();
loop {
let cur = self.cur;
match parse(self) {
Ok(t) => v.push(t),
Err(e) => {
if self.resettable(cur) {
self.reset_cur(cur);
} else {
return Err(err_fatal(e));
}
return Err(e);
},
}
let cur2 = self.cur;
match sep(self) {
Ok(()) => continue,
Err(e) => {
if self.resettable(cur2) {
self.reset_cur(cur2);
} else {
return Err(err_fatal(e));
}
break;
},
}
}
Ok(v)
}
pub fn end_by<T, F1, F2>(&mut self, parse: F1, sep: F2) -> ParseResult<Vec<T>>
where F1: Fn(&mut Stream<R>) -> ParseResult<T>,
F2: Fn(&mut Stream<R>) -> ParseResult<()>
{
let mut v = Vec::new();
let cur = self.cur;
loop {
let cur2 = self.cur;
match parse(self) {
Ok(t) => v.push(t),
Err(e) => {
if self.resettable(cur2) {
self.reset_cur(cur2);
} else {
return Err(err_fatal(e));
}
break;
},
}
match sep(self) {
Ok(()) => continue,
Err(e) => {
if self.resettable(cur) {
self.reset_cur(cur);
} else {
return Err(err_fatal(e));
}
return Err(e);
},
}
}
Ok(v)
}
pub fn end_by_one<T, F1, F2>(&mut self, parse: F1, sep: F2) -> ParseResult<Vec<T>>
where F1: Fn(&mut Stream<R>) -> ParseResult<T>,
F2: Fn(&mut Stream<R>) -> ParseResult<()>
{
let mut first = true;
let mut v = Vec::new();
let cur = self.cur;
loop {
let cur2 = self.cur;
match parse(self) {
Ok(t) => {
first = false;
v.push(t);
},
Err(e) => {
if self.resettable(cur2) {
self.reset_cur(cur2);
} else {
return Err(err_fatal(e));
}
if first {
return Err(e);
}
break;
},
}
match sep(self) {
Ok(()) => continue,
Err(e) => {
if self.resettable(cur) {
self.reset_cur(cur);
} else {
return Err(err_fatal(e));
}
return Err(e);
},
}
}
Ok(v)
}
}
#[cfg(test)]
mod test;