(token: string)
| 249 | } |
| 250 | |
| 251 | private parseNumber(token: string): number | undefined { |
| 252 | const normalized = token.replace(/_/g, "") |
| 253 | if (/^[+-]?(?:inf|nan)$/.test(token)) { |
| 254 | if (normalized.endsWith("nan")) return Number.NaN |
| 255 | return normalized[0] === "-" ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY |
| 256 | } |
| 257 | if (/^0x[0-9A-Fa-f](?:_?[0-9A-Fa-f])*$/.test(token)) { |
| 258 | return Number.parseInt(normalized.slice(2), 16) |
| 259 | } |
| 260 | if (/^0o[0-7](?:_?[0-7])*$/.test(token)) { |
| 261 | return Number.parseInt(normalized.slice(2), 8) |
| 262 | } |
| 263 | if (/^0b[01](?:_?[01])*$/.test(token)) { |
| 264 | return Number.parseInt(normalized.slice(2), 2) |
| 265 | } |
| 266 | if (/^[+-]?(?:0|[1-9](?:_?\d)*)$/.test(token)) { |
| 267 | return Number(normalized) |
| 268 | } |
| 269 | if ( |
| 270 | /^[+-]?(?:(?:0|[1-9](?:_?\d)*)\.\d(?:_?\d)*(?:[eE][+-]?\d(?:_?\d)*)?|(?:0|[1-9](?:_?\d)*)[eE][+-]?\d(?:_?\d)*)$/ |
| 271 | .test( |
| 272 | token |
| 273 | ) |
| 274 | ) { |
| 275 | return Number(normalized) |
| 276 | } |
| 277 | return undefined |
| 278 | } |
| 279 | |
| 280 | private parseBasicString(multiline: boolean): string { |
| 281 | this.expect("\"") |
no test coverage detected