1
0

Simplify the parser by removing a value

This commit is contained in:
Jeff 2024-11-05 22:10:13 -05:00
parent 9650183c73
commit ea46bfe5da

View File

@ -48,7 +48,6 @@ struct Parser<'src> {
lexer: Lexer<'src>, lexer: Lexer<'src>,
chunk: Chunk, chunk: Chunk,
current_statement_length: usize,
current_is_expression: bool, current_is_expression: bool,
minimum_register: u8, minimum_register: u8,
@ -72,7 +71,6 @@ impl<'src> Parser<'src> {
Ok(Parser { Ok(Parser {
lexer, lexer,
chunk: Chunk::new(None), chunk: Chunk::new(None),
current_statement_length: 0,
current_is_expression: false, current_is_expression: false,
minimum_register: 0, minimum_register: 0,
current_token, current_token,
@ -216,14 +214,12 @@ impl<'src> Parser<'src> {
position.to_string() position.to_string()
); );
self.current_statement_length += 1;
self.chunk.instructions_mut().push((instruction, position)); self.chunk.instructions_mut().push((instruction, position));
} }
fn optimize_statement(&mut self) { fn optimize_statement(&mut self) {
if matches!( if matches!(
self.get_end_of_statement(), self.get_last_instructions(),
Some([ Some([
Operation::LoadBoolean | Operation::LoadConstant, Operation::LoadBoolean | Operation::LoadConstant,
Operation::LoadBoolean | Operation::LoadConstant, Operation::LoadBoolean | Operation::LoadConstant,
@ -254,8 +250,6 @@ impl<'src> Parser<'src> {
*second_loader = second_loader_new; *second_loader = second_loader_new;
} }
self.current_statement_length = 0;
} }
fn pop_last_instruction(&mut self) -> Result<(Instruction, Span), ParseError> { fn pop_last_instruction(&mut self) -> Result<(Instruction, Span), ParseError> {
@ -272,22 +266,11 @@ impl<'src> Parser<'src> {
self.chunk self.chunk
.instructions() .instructions()
.iter() .iter()
.rev() .last()
.take(self.current_statement_length) .map(|(instruction, _)| instruction.operation())
.find_map(|(instruction, _)| {
if instruction.yields_value() {
Some(instruction.operation())
} else {
None
}
})
}
fn get_end_of_statement<const COUNT: usize>(&self) -> Option<[Operation; COUNT]> {
if self.current_statement_length < COUNT {
return None;
} }
fn get_last_instructions<const COUNT: usize>(&self) -> Option<[Operation; COUNT]> {
let mut operations = [Operation::Return; COUNT]; let mut operations = [Operation::Return; COUNT];
for (index, (instruction, _)) in self for (index, (instruction, _)) in self
@ -1023,7 +1006,7 @@ impl<'src> Parser<'src> {
self.parse_expression()?; self.parse_expression()?;
if matches!( if matches!(
self.get_end_of_statement(), self.get_last_instructions(),
Some([ Some([
Operation::LoadBoolean, Operation::LoadBoolean,
Operation::LoadBoolean, Operation::LoadBoolean,
@ -1163,7 +1146,7 @@ impl<'src> Parser<'src> {
self.parse_expression()?; self.parse_expression()?;
if matches!( if matches!(
self.get_end_of_statement(), self.get_last_instructions(),
Some([ Some([
Operation::LoadBoolean, Operation::LoadBoolean,
Operation::LoadBoolean, Operation::LoadBoolean,