(&mut self)
| 2076 | .map_err(|_| self.error("invalid integer literal"))?; |
| 2077 | self.advance(); |
| 2078 | Ok(value) |
| 2079 | } |
| 2080 | Some(tok) => Err(self.error_with_token("expected integer literal", tok)), |
| 2081 | None => Err(self.error("unexpected end of input")), |
| 2082 | } |
| 2083 | } |
| 2084 | |
| 2085 | fn expect_hex_integer(&mut self) -> Result<i64, ParserError> { |
| 2086 | match self.peek() { |
| 2087 | Some(Token::HexInteger(text)) => { |
| 2088 | let digits = strip_separators(text); |
| 2089 | let trimmed = digits.trim_start_matches("0x").trim_start_matches("0X"); |
| 2090 | // Parse as u64 first to handle large addresses, then cast to i64 |
| 2091 | let value_u64 = u64::from_str_radix(trimmed, 16) |
| 2092 | .map_err(|_| self.error("invalid hex literal"))?; |
| 2093 | let value = crate::conv::u64_bits_to_i64(value_u64); |
| 2094 | self.advance(); |
| 2095 | Ok(value) |
| 2096 | } |
| 2097 | Some(tok) => Err(self.error_with_token("expected hex integer literal", tok)), |
| 2098 | None => Err(self.error("unexpected end of input")), |
| 2099 | } |
| 2100 | } |
| 2101 | |
| 2102 | fn expect_bin_integer(&mut self) -> Result<i64, ParserError> { |
| 2103 | match self.peek() { |
| 2104 | Some(Token::BinInteger(text)) => { |
| 2105 | let digits = strip_separators(text); |
| 2106 | let trimmed = digits.trim_start_matches("0b").trim_start_matches("0B"); |
| 2107 | // Parse as u64 first so a full-width mask keeps its bit pattern. |
| 2108 | let value_u64 = u64::from_str_radix(trimmed, 2) |
| 2109 | .map_err(|_| self.error("invalid binary literal"))?; |
| 2110 | let value = crate::conv::u64_bits_to_i64(value_u64); |
no test coverage detected