MCPcopy Create free account
hub / github.com/dylan-sutton-chavez/edge-python / parse_number

Method parse_number

compiler/src/modules/parser/expr.rs:281–316  ·  view source on GitHub ↗
(&mut self, raw: &str, kind: TokenType)

Source from the content-addressed store, hash-verified

279 }
280
281 pub(super) fn parse_number(&mut self, raw: &str, kind: TokenType) {
282 let s = raw.replace('_', "");
283 if kind == TokenType::Float {
284 // A malformed float (e.g. empty exponent `1e`) is a syntax error, not 0.0.
285 match s.parse() {
286 Ok(f) => self.emit_const(Value::Float(f)),
287 Err(_) => self.error("invalid float literal"),
288 }
289 return;
290 }
291 let (digits, base) = Self::parse_int_prefix(&s);
292 // No leading zeros; all-zero runs still valid.
293 if base == 10 && digits.len() > 1 && digits.starts_with('0') && digits.bytes().any(|b| b != b'0') {
294 self.error("leading zeros in decimal integer literals are not permitted");
295 return;
296 }
297 let parsed_i64 = if base == 10 {
298 digits.parse::<i64>().ok()
299 } else {
300 i64::from_str_radix(digits, base).ok()
301 };
302 if let Some(v) = parsed_i64 {
303 self.emit_const(Value::Int(v));
304 return;
305 }
306 // Doesn't fit in i64, try i128 for the wide-int path.
307 let parsed_i128 = if base == 10 {
308 digits.parse::<i128>().ok()
309 } else {
310 i128::from_str_radix(digits, base).ok()
311 };
312 match parsed_i128 {
313 Some(v) => self.emit_const(Value::LongInt(v)),
314 None => self.error("integer literal too large to represent (max ±2^127)"),
315 }
316 }
317
318 /* Subscript after `[`: plain index or `a:b:c` slice with None defaults. Eats the closing `]`; emits BuildSlice for slices. Returns true when a slice was built. */
319 pub(super) fn parse_subscript(&mut self) -> bool {

Callers 1

parse_atomMethod · 0.80

Calls 4

emit_constMethod · 0.80
errorMethod · 0.80
parseMethod · 0.45
lenMethod · 0.45

Tested by

no test coverage detected