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

@@ -9,9 +9,7 @@ fuzz_target!(|s: &str| {
log::debug!("lexer = {:?}", lexer); log::debug!("lexer = {:?}", lexer);
if let Ok(lexer) = lexer { if let Ok(lexer) = lexer {
let mut parser = isle::parser::Parser::new(lexer); let defs = isle::parser::parse(lexer);
let defs = parser.parse_defs();
log::debug!("defs = {:?}", defs); log::debug!("defs = {:?}", defs);
} }
}); });

View File

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

View File

@@ -35,8 +35,7 @@ fn main() -> Result<()> {
let opts = Opts::from_args(); let opts = Opts::from_args();
let lexer = lexer::Lexer::from_files(opts.inputs)?; let lexer = lexer::Lexer::from_files(opts.inputs)?;
let mut parser = parser::Parser::new(lexer); let defs = parser::parse(lexer)?;
let defs = parser.parse_defs()?;
let code = compile::compile(&defs)?; let code = compile::compile(&defs)?;
let stdout = io::stdout(); let stdout = io::stdout();