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:
committed by
Chris Fallin
parent
e3aeb850b2
commit
6604a26e27
@@ -9,9 +9,7 @@ fuzz_target!(|s: &str| {
|
||||
log::debug!("lexer = {:?}", lexer);
|
||||
|
||||
if let Ok(lexer) = lexer {
|
||||
let mut parser = isle::parser::Parser::new(lexer);
|
||||
|
||||
let defs = parser.parse_defs();
|
||||
let defs = isle::parser::parse(lexer);
|
||||
log::debug!("defs = {:?}", defs);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -35,8 +35,7 @@ fn main() -> Result<()> {
|
||||
let opts = Opts::from_args();
|
||||
|
||||
let lexer = lexer::Lexer::from_files(opts.inputs)?;
|
||||
let mut parser = parser::Parser::new(lexer);
|
||||
let defs = parser.parse_defs()?;
|
||||
let defs = parser::parse(lexer)?;
|
||||
let code = compile::compile(&defs)?;
|
||||
|
||||
let stdout = io::stdout();
|
||||
|
||||
Reference in New Issue
Block a user