Add octal, binary and hexadecimal representation
This commit is contained in:
parent
25fb6bf0fd
commit
22160b0802
@ -2,8 +2,8 @@
|
||||
|
||||
|
||||
fn main() -> u32 {
|
||||
let value = 6;
|
||||
let other = 15;
|
||||
let value = 0b110;
|
||||
let other = 0o17;
|
||||
|
||||
return value * other + 7 * -value;
|
||||
}
|
||||
|
@ -153,6 +153,24 @@ impl Parse for PrimaryExpression {
|
||||
Expression(Kind::VariableName(v.clone()), stream.get_range().unwrap())
|
||||
}
|
||||
}
|
||||
Token::BinaryValue(v) => {
|
||||
stream.next(); // Consume octal
|
||||
Expression(
|
||||
Kind::Literal(Literal::Integer(
|
||||
u128::from_str_radix(&v, 2).expect("Binary is not parseable as u128!"),
|
||||
)),
|
||||
stream.get_range().unwrap(),
|
||||
)
|
||||
}
|
||||
Token::OctalValue(v) => {
|
||||
stream.next(); // Consume octal
|
||||
Expression(
|
||||
Kind::Literal(Literal::Integer(
|
||||
u128::from_str_radix(&v, 8).expect("Octal is not parseable as u128!"),
|
||||
)),
|
||||
stream.get_range().unwrap(),
|
||||
)
|
||||
}
|
||||
Token::HexadecimalValue(v) => {
|
||||
stream.next(); // Consume hexadecimal
|
||||
Expression(
|
||||
|
@ -19,6 +19,10 @@ pub enum Token {
|
||||
DecimalValue(String),
|
||||
/// Integer number in the hexadecimal base
|
||||
HexadecimalValue(String),
|
||||
/// Integer number in the octal base
|
||||
OctalValue(String),
|
||||
/// Integer number in the binary base
|
||||
BinaryValue(String),
|
||||
/// Some character literal that was surrounded by 'single-quotes'.
|
||||
CharLit(String),
|
||||
/// Some string literal that was surrounded by "double-quotes".
|
||||
@ -141,7 +145,9 @@ impl ToString for Token {
|
||||
match &self {
|
||||
Token::Identifier(ident) => ident.clone(),
|
||||
Token::DecimalValue(val) => val.to_string(),
|
||||
Token::HexadecimalValue(val) => val.to_string(),
|
||||
Token::HexadecimalValue(val) => format!("0x{}", val),
|
||||
Token::OctalValue(val) => format!("0o{}", val),
|
||||
Token::BinaryValue(val) => format!("0b{}", val),
|
||||
Token::CharLit(lit) => format!("\'{}\'", lit),
|
||||
Token::StringLit(lit) => format!("\"{}\"", lit),
|
||||
Token::LetKeyword => String::from("let"),
|
||||
@ -370,6 +376,18 @@ pub fn tokenize<T: Into<String>>(to_tokenize: T) -> Result<Vec<FullToken>, Error
|
||||
cursor.next();
|
||||
value = NumberType::Hexadecimal(String::new());
|
||||
numerics = HEXADECIMAL_NUMERICS;
|
||||
} else if cursor.first() == Some('o')
|
||||
&& OCTAL_NUMERICS.contains(&second.to_lowercase().next().unwrap_or('.'))
|
||||
{
|
||||
cursor.next();
|
||||
value = NumberType::Octal(String::new());
|
||||
numerics = OCTAL_NUMERICS;
|
||||
} else if cursor.first() == Some('b')
|
||||
&& BINARY_NUMERICS.contains(&second.to_lowercase().next().unwrap_or('.'))
|
||||
{
|
||||
cursor.next();
|
||||
value = NumberType::Binary(String::new());
|
||||
numerics = BINARY_NUMERICS;
|
||||
}
|
||||
}
|
||||
while let Some(c) = cursor.first() {
|
||||
@ -380,8 +398,10 @@ pub fn tokenize<T: Into<String>>(to_tokenize: T) -> Result<Vec<FullToken>, Error
|
||||
cursor.next();
|
||||
}
|
||||
match value {
|
||||
NumberType::Decimal(value) => Token::DecimalValue(value),
|
||||
NumberType::Decimal(dec) => Token::DecimalValue(dec),
|
||||
NumberType::Hexadecimal(hex) => Token::HexadecimalValue(hex),
|
||||
NumberType::Octal(oct) => Token::OctalValue(oct),
|
||||
NumberType::Binary(bin) => Token::BinaryValue(bin),
|
||||
}
|
||||
}
|
||||
'-' if cursor.first() == Some('>') => {
|
||||
@ -440,6 +460,8 @@ fn escape_char(c: &char) -> char {
|
||||
enum NumberType {
|
||||
Decimal(String),
|
||||
Hexadecimal(String),
|
||||
Octal(String),
|
||||
Binary(String),
|
||||
}
|
||||
|
||||
impl AddAssign<char> for NumberType {
|
||||
@ -449,6 +471,8 @@ impl AddAssign<char> for NumberType {
|
||||
NumberType::Hexadecimal(val) => {
|
||||
NumberType::Hexadecimal(val.to_owned() + &rhs.to_string())
|
||||
}
|
||||
NumberType::Octal(val) => NumberType::Octal(val.to_owned() + &rhs.to_string()),
|
||||
NumberType::Binary(val) => NumberType::Binary(val.to_owned() + &rhs.to_string()),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user