diff options
Diffstat (limited to 'users/tazjin/rlox/src/bytecode/compiler.rs')
-rw-r--r-- | users/tazjin/rlox/src/bytecode/compiler.rs | 89 |
1 files changed, 27 insertions, 62 deletions
diff --git a/users/tazjin/rlox/src/bytecode/compiler.rs b/users/tazjin/rlox/src/bytecode/compiler.rs index 3e8a80653f91..89584f19d720 100644 --- a/users/tazjin/rlox/src/bytecode/compiler.rs +++ b/users/tazjin/rlox/src/bytecode/compiler.rs @@ -63,9 +63,11 @@ enum Precedence { Equality, // == != Comparison, // < > <= >= Term, // + - - Factor, // * / - Unary, // ! - - Call, // . () + Factor, // + // + // * / + Unary, // ! - + Call, // . () Primary, } @@ -78,11 +80,7 @@ struct ParseRule<T: Iterator<Item = Token>> { } impl<T: Iterator<Item = Token>> ParseRule<T> { - fn new( - prefix: Option<ParseFn<T>>, - infix: Option<ParseFn<T>>, - precedence: Precedence, - ) -> Self { + fn new(prefix: Option<ParseFn<T>>, infix: Option<ParseFn<T>>, precedence: Precedence) -> Self { ParseRule { prefix, infix, @@ -105,18 +103,16 @@ impl Precedence { Precedence::Factor => Precedence::Unary, Precedence::Unary => Precedence::Call, Precedence::Call => Precedence::Primary, - Precedence::Primary => panic!( - "invalid parser state: no higher precedence than Primary" - ), + Precedence::Primary => { + panic!("invalid parser state: no higher precedence than Primary") + } } } } fn rule_for<T: Iterator<Item = Token>>(token: &TokenKind) -> ParseRule<T> { match token { - TokenKind::LeftParen => { - ParseRule::new(Some(Compiler::grouping), None, Precedence::None) - } + TokenKind::LeftParen => ParseRule::new(Some(Compiler::grouping), None, Precedence::None), TokenKind::Minus => ParseRule::new( Some(Compiler::unary), @@ -124,57 +120,33 @@ fn rule_for<T: Iterator<Item = Token>>(token: &TokenKind) -> ParseRule<T> { Precedence::Term, ), - TokenKind::Plus => { - ParseRule::new(None, Some(Compiler::binary), Precedence::Term) - } + TokenKind::Plus => ParseRule::new(None, Some(Compiler::binary), Precedence::Term), - TokenKind::Slash => { - ParseRule::new(None, Some(Compiler::binary), Precedence::Factor) - } + TokenKind::Slash => ParseRule::new(None, Some(Compiler::binary), Precedence::Factor), - TokenKind::Star => { - ParseRule::new(None, Some(Compiler::binary), Precedence::Factor) - } + TokenKind::Star => ParseRule::new(None, Some(Compiler::binary), Precedence::Factor), - TokenKind::Number(_) => { - ParseRule::new(Some(Compiler::number), None, Precedence::None) - } + TokenKind::Number(_) => ParseRule::new(Some(Compiler::number), None, Precedence::None), - TokenKind::True => { - ParseRule::new(Some(Compiler::literal), None, Precedence::None) - } + TokenKind::True => ParseRule::new(Some(Compiler::literal), None, Precedence::None), - TokenKind::False => { - ParseRule::new(Some(Compiler::literal), None, Precedence::None) - } + TokenKind::False => ParseRule::new(Some(Compiler::literal), None, Precedence::None), - TokenKind::Nil => { - ParseRule::new(Some(Compiler::literal), None, Precedence::None) - } + TokenKind::Nil => ParseRule::new(Some(Compiler::literal), None, Precedence::None), - TokenKind::Bang => { - ParseRule::new(Some(Compiler::unary), None, Precedence::None) - } + TokenKind::Bang => ParseRule::new(Some(Compiler::unary), None, Precedence::None), - TokenKind::BangEqual => { - ParseRule::new(None, Some(Compiler::binary), Precedence::Equality) - } + TokenKind::BangEqual => ParseRule::new(None, Some(Compiler::binary), Precedence::Equality), - TokenKind::EqualEqual => { - ParseRule::new(None, Some(Compiler::binary), Precedence::Equality) - } + TokenKind::EqualEqual => ParseRule::new(None, Some(Compiler::binary), Precedence::Equality), - TokenKind::Greater => { - ParseRule::new(None, Some(Compiler::binary), Precedence::Comparison) - } + TokenKind::Greater => ParseRule::new(None, Some(Compiler::binary), Precedence::Comparison), TokenKind::GreaterEqual => { ParseRule::new(None, Some(Compiler::binary), Precedence::Comparison) } - TokenKind::Less => { - ParseRule::new(None, Some(Compiler::binary), Precedence::Comparison) - } + TokenKind::Less => ParseRule::new(None, Some(Compiler::binary), Precedence::Comparison), TokenKind::LessEqual => { ParseRule::new(None, Some(Compiler::binary), Precedence::Comparison) @@ -184,9 +156,7 @@ fn rule_for<T: Iterator<Item = Token>>(token: &TokenKind) -> ParseRule<T> { ParseRule::new(Some(Compiler::variable), None, Precedence::None) } - TokenKind::String(_) => { - ParseRule::new(Some(Compiler::string), None, Precedence::None) - } + TokenKind::String(_) => ParseRule::new(Some(Compiler::string), None, Precedence::None), _ => ParseRule::new(None, None, Precedence::None), } @@ -236,9 +206,7 @@ impl<T: Iterator<Item = Token>> Compiler<T> { fn define_variable(&mut self, var: Option<ConstantIdx>) -> LoxResult<()> { if self.locals.scope_depth == 0 { - self.emit_op(OpCode::OpDefineGlobal( - var.expect("should be global"), - )); + self.emit_op(OpCode::OpDefineGlobal(var.expect("should be global"))); } else { self.locals .locals @@ -305,9 +273,7 @@ impl<T: Iterator<Item = Token>> Compiler<T> { } fn block(&mut self) -> LoxResult<()> { - while !self.check(&TokenKind::RightBrace) - && !self.check(&TokenKind::Eof) - { + while !self.check(&TokenKind::RightBrace) && !self.check(&TokenKind::Eof) { self.declaration()?; } @@ -712,9 +678,8 @@ impl<T: Iterator<Item = Token>> Compiler<T> { pub fn compile(code: &str) -> Result<(Interner, Chunk), Vec<Error>> { let chars = code.chars().collect::<Vec<char>>(); - let tokens = scanner::scan(&chars).map_err(|errors| { - errors.into_iter().map(Into::into).collect::<Vec<Error>>() - })?; + let tokens = scanner::scan(&chars) + .map_err(|errors| errors.into_iter().map(Into::into).collect::<Vec<Error>>())?; let mut compiler = Compiler { tokens: tokens.into_iter().peekable(), |