Parse PATH constructor: PATH[expr1, expr2, ...] or PATH + vector
(tokens: &[Token])
| 1993 | |
| 1994 | /// Parse PATH constructor: PATH[expr1, expr2, ...] or PATH + vector |
| 1995 | fn path_constructor(tokens: &[Token]) -> IResult<&[Token], PathConstructor> { |
| 1996 | let (tokens, _) = expect_token(Token::Path)(tokens)?; |
| 1997 | |
| 1998 | // Handle case where lexer parsed brackets with numbers as a vector literal |
| 1999 | if let Some(Token::Vector(values)) = tokens.first() { |
| 2000 | let (tokens, _) = expect_token_variant(&|t| matches!(t, Token::Vector(_)))(tokens)?; |
| 2001 | |
| 2002 | // Convert vector values to literal expressions |
| 2003 | let elements = values |
| 2004 | .iter() |
| 2005 | .map(|&v| Expression::Literal(crate::ast::Literal::Float(v))) |
| 2006 | .collect(); |
| 2007 | |
| 2008 | return Ok(( |
| 2009 | tokens, |
| 2010 | PathConstructor { |
| 2011 | elements, |
| 2012 | location: Location::default(), |
| 2013 | }, |
| 2014 | )); |
| 2015 | } |
| 2016 | |
| 2017 | let (tokens, _) = expect_token(Token::LeftBracket)(tokens)?; |
| 2018 | |
| 2019 | // Check for empty PATH[] |
| 2020 | if matches!(tokens.first(), Some(Token::RightBracket)) { |
| 2021 | let (tokens, _) = expect_token(Token::RightBracket)(tokens)?; |
| 2022 | return Ok(( |
| 2023 | tokens, |
| 2024 | PathConstructor { |
| 2025 | elements: vec![], |
| 2026 | location: Location::default(), |
| 2027 | }, |
| 2028 | )); |
| 2029 | } |
| 2030 | |
| 2031 | // Parse expressions |
| 2032 | let (tokens, elements) = expression_list(tokens)?; |
| 2033 | let (tokens, _) = expect_token(Token::RightBracket)(tokens)?; |
| 2034 | |
| 2035 | Ok(( |
| 2036 | tokens, |
| 2037 | PathConstructor { |
| 2038 | elements, |
| 2039 | location: Location::default(), |
| 2040 | }, |
| 2041 | )) |
| 2042 | } |
| 2043 | |
| 2044 | /// Parse postfix expressions: primary_expr[index] | primary_expr |
| 2045 | fn postfix_expression(tokens: &[Token]) -> IResult<&[Token], Expression> { |
nothing calls this directly
no test coverage detected