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);
|
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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user