Support Hex, Binary, and Octal number literals #20
|
@ -292,6 +292,18 @@ impl<'a> Lexer<'a> {
|
||||||
|
|
||||||
let kind = match c {
|
let kind = match c {
|
||||||
..=b' ' => continue,
|
..=b' ' => continue,
|
||||||
|
b'0' if self.advance_if(b'x') => {
|
||||||
|
while let Some(b'0'..=b'9') = self.peek() {
|
||||||
|
self.advance();
|
||||||
|
}
|
||||||
|
T::Number
|
||||||
|
}
|
||||||
|
b'0' if self.advance_if(b'b') => {
|
||||||
|
while let Some(b'0'..=b'9') = self.peek() {
|
||||||
|
self.advance();
|
||||||
|
}
|
||||||
|
T::Number
|
||||||
|
}
|
||||||
b'0'..=b'9' => {
|
b'0'..=b'9' => {
|
||||||
while let Some(b'0'..=b'9') = self.peek() {
|
while let Some(b'0'..=b'9') = self.peek() {
|
||||||
self.advance();
|
self.advance();
|
||||||
|
|
|
@ -391,9 +391,18 @@ impl<'a, 'b> Parser<'a, 'b> {
|
||||||
},
|
},
|
||||||
T::Number => E::Number {
|
T::Number => E::Number {
|
||||||
pos: token.start,
|
pos: token.start,
|
||||||
value: match self.lexer.slice(token.range()).parse() {
|
value: {
|
||||||
Ok(value) => value,
|
let slice = self.lexer.slice(token.range());
|
||||||
Err(e) => self.report(format_args!("invalid number: {e}")),
|
let (slice, radix) = match &slice.get(0..2) {
|
||||||
|
Some("0x") => (slice.trim_start_matches("0x"), 16),
|
||||||
|
Some("0b") => (slice.trim_start_matches("0b"), 16),
|
||||||
|
Some("0o") => (slice.trim_start_matches("0o"), 16),
|
||||||
|
_ => (slice, 10),
|
||||||
|
};
|
||||||
|
match u64::from_str_radix(slice, radix) {
|
||||||
|
Ok(value) => value,
|
||||||
|
Err(e) => self.report(format_args!("invalid number: {e}")),
|
||||||
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
T::LParen => {
|
T::LParen => {
|
||||||
|
|
Loading…
Reference in a new issue