binary, hex, octal literal types
This commit is contained in:
@@ -391,6 +391,57 @@ impl<'a> TokenIterator<'a> {
|
||||
}
|
||||
}
|
||||
}
|
||||
'x' | 'X' => {
|
||||
result.push(nxt);
|
||||
self.char_stream.next();
|
||||
while let Some(&nxt_hex) = self.char_stream.peek() {
|
||||
match nxt_hex {
|
||||
'0'...'9' | 'a'...'f' | 'A'...'F' => {
|
||||
result.push(nxt_hex);
|
||||
self.char_stream.next();
|
||||
}
|
||||
_ => break,
|
||||
}
|
||||
}
|
||||
let out: String = result.iter().cloned().skip(2).collect();
|
||||
if let Ok(val) = i64::from_str_radix(&out, 16) {
|
||||
return Some(Token::IntConst(val));
|
||||
}
|
||||
}
|
||||
'o' | 'O' => {
|
||||
result.push(nxt);
|
||||
self.char_stream.next();
|
||||
while let Some(&nxt_oct) = self.char_stream.peek() {
|
||||
match nxt_oct {
|
||||
'0'...'8' => {
|
||||
result.push(nxt_oct);
|
||||
self.char_stream.next();
|
||||
}
|
||||
_ => break,
|
||||
}
|
||||
}
|
||||
let out: String = result.iter().cloned().skip(2).collect();
|
||||
if let Ok(val) = i64::from_str_radix(&out, 8) {
|
||||
return Some(Token::IntConst(val));
|
||||
}
|
||||
}
|
||||
'b' | 'B' => {
|
||||
result.push(nxt);
|
||||
self.char_stream.next();
|
||||
while let Some(&nxt_bin) = self.char_stream.peek() {
|
||||
match nxt_bin {
|
||||
'0' | '1' | '_' => {
|
||||
result.push(nxt_bin);
|
||||
self.char_stream.next();
|
||||
}
|
||||
_ => break,
|
||||
}
|
||||
}
|
||||
let out: String = result.iter().cloned().skip(2).filter(|c| c != &'_').collect();
|
||||
if let Ok(val) = i64::from_str_radix(&out, 2) {
|
||||
return Some(Token::IntConst(val));
|
||||
}
|
||||
}
|
||||
_ => break,
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user