From 7b90b5d2299eaaaea38b554644707ca92d29dbb4 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Fri, 24 Aug 2018 17:19:33 -0700 Subject: [PATCH] [parser] Fix crash - Create a ProgramParser on each call of next() - Fix up ending condition check --- parser/src/lib.rs | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/parser/src/lib.rs b/parser/src/lib.rs index c751ec3..a9a0506 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -33,13 +33,18 @@ pub struct Parser where T: Iterator { impl Parser where T: Iterator { pub fn new(input: T) -> Parser { - let program_parser = Box::new(ProgramParser::new()); Parser { input: input.peekable(), - parsers: vec!(program_parser) + parsers: vec![] } } + fn prepare(&mut self) { + assert_eq!(self.parsers.len(), 0); + let program_parser = Box::new(ProgramParser::new()); + self.parsers.push(program_parser); + } + fn parse_lex(&mut self, lex: &Lex) -> NodeParseResult { let parser = self.parsers.last_mut().expect("couldn't get a parser -- this is unexpected"); parser.parse(lex) @@ -81,7 +86,18 @@ impl Iterator for Parser where T: Iterator { let mut input_lex: Option = None; loop { input_lex = match result { - None => self.next_lex(), // Starting condition + None => { + let next_lex = self.next_lex(); + if next_lex.is_none() { + // First run through the loop and our input has nothing to give. + out = None; + break; + } else { + // Prepare for parsing! + self.prepare(); + } + next_lex + } Some(NodeParseResult::Continue) => self.next_lex(), Some(NodeParseResult::Complete{ obj }) => { self.pop_parser();