From 91356e9786cce67ed49b4c25b1b66ec9f1d17db2 Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Tue, 24 Sep 2024 16:26:40 +0200 Subject: Inline next token advance --- rust/src/parser.rs | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'rust') diff --git a/rust/src/parser.rs b/rust/src/parser.rs index 11948c1..c85a425 100644 --- a/rust/src/parser.rs +++ b/rust/src/parser.rs @@ -14,7 +14,7 @@ struct Parser { } impl Parser { - fn expect(&self, token: Token) -> Result<(), String> { + fn expect(&mut self, token: Token) -> Result<(), String> { if self.tokens.get(self.index) == Some(&token) { Ok(()) } else { @@ -24,14 +24,9 @@ impl Parser { self.tokens.get(self.index) )) } - } - - fn next(&mut self) { - self.index += 1; - } - - fn backtrack(&mut self) { - self.index -= 1; + .map(|_| { + self.next(); + }) } fn expect_symbol(&mut self) -> Result { @@ -40,6 +35,18 @@ impl Parser { } else { Err("Expected a symbol".to_string()) } + .map(|s| { + self.next(); + s + }) + } + + fn next(&mut self) { + self.index += 1; + } + + fn backtrack(&mut self) { + self.index -= 1; } } @@ -59,32 +66,26 @@ fn parse_expression(parser: &mut Parser) -> Result { fn parse_abstraction(parser: &mut Parser) -> Result { parser.expect(Token::LParen)?; - parser.next(); parser.expect(Token::Lambda).map_err(|e| { parser.backtrack(); e.to_string() })?; - parser.next(); let var = parse_variable(parser)?; let body = parse_expression(parser)?; parser.expect(Token::RParen)?; - parser.next(); Ok(Value::Lam(var, Box::new(body))) } fn parse_variable(parser: &mut Parser) -> Result { let var = parser.expect_symbol()?; - parser.next(); Ok(var) } fn parse_application(parser: &mut Parser) -> Result { parser.expect(Token::LParen)?; - parser.next(); let left = parse_expression(parser)?; let right = parse_expression(parser)?; parser.expect(Token::RParen)?; - parser.next(); Ok(Value::App(Box::new(left), Box::new(right))) } -- cgit v1.2.3