Add a top-level parse function

And make `parse_defs` take `self` by ownership. This avoids a couple `Vec`
clones.
This commit is contained in:
Nick Fitzgerald
2021-09-29 13:18:30 -07:00
committed by Chris Fallin
parent e3aeb850b2
commit 6604a26e27
3 changed files with 12 additions and 10 deletions

View File

@@ -4,11 +4,17 @@ use crate::ast::*;
use crate::error::*;
use crate::lexer::{Lexer, Pos, Token};
/// Parse the top-level ISLE definitions and return their AST.
pub fn parse(lexer: Lexer) -> Result<Defs> {
let parser = Parser::new(lexer);
parser.parse_defs()
}
/// The ISLE parser.
///
/// Takes in a lexer and creates an AST.
#[derive(Clone, Debug)]
pub struct Parser<'a> {
struct Parser<'a> {
lexer: Lexer<'a>,
}
@@ -113,16 +119,15 @@ impl<'a> Parser<'a> {
}
}
/// Parse the top-level ISLE definitions and return their AST.
pub fn parse_defs(&mut self) -> Result<Defs> {
fn parse_defs(mut self) -> Result<Defs> {
let mut defs = vec![];
while !self.lexer.eof() {
defs.push(self.parse_def()?);
}
Ok(Defs {
defs,
filenames: self.lexer.filenames.clone(),
file_texts: self.lexer.file_texts.clone(),
filenames: self.lexer.filenames,
file_texts: self.lexer.file_texts,
})
}