[parser] Fix crash
- Create a ProgramParser on each call of next() - Fix up ending condition check
This commit is contained in:
		
							parent
							
								
									fea93f44eb
								
							
						
					
					
						commit
						7b90b5d229
					
				
					 1 changed files with 19 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -33,13 +33,18 @@ pub struct Parser<T> where T: Iterator<Item=LexerResult> {
 | 
			
		|||
 | 
			
		||||
impl<T> Parser<T> where T: Iterator<Item=LexerResult> {
 | 
			
		||||
    pub fn new(input: T) -> Parser<T> {
 | 
			
		||||
        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<T> Iterator for Parser<T> where T: Iterator<Item=LexerResult> {
 | 
			
		|||
        let mut input_lex: Option<T::Item> = 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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue