From 31c70babc9cba5dbe71a6ce66c8dd84e528f5c83 Mon Sep 17 00:00:00 2001 From: me Date: Tue, 16 Dec 2025 12:46:50 +0200 Subject: [PATCH] refactor identifier parsing --- src/parser/parser.rs | 65 +++++++++---------- ...rser__parser__tests__paren_identifier.snap | 11 ++++ src/parser/types.rs | 5 +- 3 files changed, 44 insertions(+), 37 deletions(-) create mode 100644 src/parser/snapshots/ayin__parser__parser__tests__paren_identifier.snap diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 3036a50..80f4c49 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -16,11 +16,7 @@ pub fn parse(tokens: &mut Tokens, parser: Parser) -> Result { fn parse_definition(tokens: &mut Tokens) -> ParseResult { if let Some(_) = tokens.next_if(Token::Let) { - if let Some(LocatedToken { - token: Token::Identifier(identifier), - .. - }) = tokens.next_if(Token::Identifier("".into())) - { + if let Some(identifier) = parse_identifier_(tokens)? { if let Some(_eq) = tokens.next_if(Token::Equals) { if let Some(expr) = parse_expr(tokens)? { if let Some(_) = tokens.next_if(Token::Semicolon) { @@ -53,7 +49,6 @@ fn parse_definition(tokens: &mut Tokens) -> ParseResult { }) } } else { - println!("not let! {tokens:#?}"); Ok(None) } } @@ -73,44 +68,42 @@ fn parse_simple_expr(tokens: &mut Tokens) -> ParseResult { } fn parse_string(tokens: &mut Tokens) -> ParseResult { + if let Some(LocatedToken { + token: Token::String(string), + .. + }) = tokens.next_if(Token::String("".into())) { - if let Some(LocatedToken { - token: Token::String(string), - .. - }) = tokens.next_if(Token::String("".into())) - { - Ok(Some(ast::Expr::Value(ast::Value::String(string)))) - } else { - Ok(None) - } + Ok(Some(ast::Expr::Value(ast::Value::String(string)))) + } else { + Ok(None) } } fn parse_number(tokens: &mut Tokens) -> ParseResult { + if let Some(LocatedToken { + token: Token::Number(number), + .. + }) = tokens.next_if(Token::Number(0)) { - if let Some(LocatedToken { - token: Token::Number(number), - .. - }) = tokens.next_if(Token::Number(0)) - { - Ok(Some(ast::Expr::Value(ast::Value::Int(number.into())))) - } else { - Ok(None) - } + Ok(Some(ast::Expr::Value(ast::Value::Int(number.into())))) + } else { + Ok(None) } } fn parse_identifier(tokens: &mut Tokens) -> ParseResult { + Ok(parse_identifier_(tokens)?.map(|string| ast::Expr::Var(ast::Name(string)))) +} + +fn parse_identifier_(tokens: &mut Tokens) -> ParseResult { + if let Some(LocatedToken { + token: Token::Identifier(string), + .. + }) = tokens.next_if(Token::Identifier("".into())) { - if let Some(LocatedToken { - token: Token::Identifier(string), - .. - }) = tokens.next_if(Token::String("".into())) - { - Ok(Some(ast::Expr::Var(ast::Name(string)))) - } else { - Ok(None) - } + Ok(Some(string)) + } else { + Ok(None) } } @@ -149,6 +142,12 @@ mod tests { insta::assert_debug_snapshot!(result); } #[test] + fn paren_identifier() { + let program = "(hello)".to_string(); + let result = parse(&mut scan(program), parse_expr); + insta::assert_debug_snapshot!(result); + } + #[test] fn let_number() { let program = "let x = 108;".to_string(); let result = parse(&mut scan(program), parse_definition); diff --git a/src/parser/snapshots/ayin__parser__parser__tests__paren_identifier.snap b/src/parser/snapshots/ayin__parser__parser__tests__paren_identifier.snap new file mode 100644 index 0000000..28b09f3 --- /dev/null +++ b/src/parser/snapshots/ayin__parser__parser__tests__paren_identifier.snap @@ -0,0 +1,11 @@ +--- +source: src/parser/parser.rs +expression: result +--- +Ok( + Var( + Name( + "hello", + ), + ), +) diff --git a/src/parser/types.rs b/src/parser/types.rs index 5d2f19f..d9dfdc5 100644 --- a/src/parser/types.rs +++ b/src/parser/types.rs @@ -51,10 +51,7 @@ impl Tokens { (Token::Identifier(_), Token::Identifier(_)) => true, (Token::Number(_), Token::Number(_)) => true, (Token::String(_), Token::String(_)) => true, - x => { - println!("next_if fail: {x:#?}"); - false - } + x => false, }) } pub fn between(&mut self, start: Token, end: Token, parser: Parser) -> ParseResult {