Support for writing multidimensional lenghts as km2 etc

This commit is contained in:
Kasper 2020-01-13 18:13:43 +01:00
parent 388825f9ac
commit adaf4eb4ac

View File

@ -72,6 +72,50 @@ pub fn lex(input: &str) -> Result<TokenVector, String> {
} }
} }
// allow for syntax like "km2"
let mut is_multidimensional = true;
match chars.peek() {
// ...if the string is succeeded by 2 or 3
Some('2') | Some('3') => {
byte_index += '2'.len_utf8();
chars.next();
// match chars.peek().unwrap_or(&'-') {
// ...and if the 2 or 3 isn't part of a different number
// '.' | '0'..='9' => {
// is_multidimensional = false;
// },
// we allow everything else and let the parser throw errors
// for things like km2pi
// _ => {}
// }
},
_ => is_multidimensional = false,
}
if is_multidimensional {
let string_plus_one_character = &input[start_index..=end_index+1];
println!("YUP {}", string_plus_one_character);
match string_plus_one_character {
"mm2" | "millimeter2" | "millimeters2" => tokens.push(Token::Unit(SquareMillimeter)),
"cm2" | "centimeter2" | "centimeters2" => tokens.push(Token::Unit(SquareCentimeter)),
"dm2" | "decimeter2" | "decimeters2" => tokens.push(Token::Unit(SquareCentimeter)),
"m2" | "meter2" | "meters2" => tokens.push(Token::Unit(SquareMeter)),
"km2" | "kilometer2" | "kilometers2" => tokens.push(Token::Unit(SquareKilometer)),
"in2" | "inch2" | "inches2" => tokens.push(Token::Unit(SquareInch)),
"ft2" | "foot2" | "feet2" => tokens.push(Token::Unit(SquareFoot)),
"yd2" | "yard2" | "yards2" => tokens.push(Token::Unit(SquareYard)),
"mi2" | "mile2" | "miles2" => tokens.push(Token::Unit(SquareMile)),
"mm3" | "millimeter3" | "millimeters3" => tokens.push(Token::Unit(CubicMillimeter)),
"cm3" | "centimeter3" | "centimeters3" => tokens.push(Token::Unit(CubicCentimeter)),
"dm3" | "decimeter3" | "decimeters3" => tokens.push(Token::Unit(CubicCentimeter)),
"m3" | "meter3" | "meters3" => tokens.push(Token::Unit(CubicMeter)),
"km3" | "kilometer3" | "kilometers3" => tokens.push(Token::Unit(CubicKilometer)),
"inc3" | "inch3" | "inches3" => tokens.push(Token::Unit(CubicInch)),
"ft3" | "foot3" | "feet3" => tokens.push(Token::Unit(CubicFoot)),
"yd3" | "yard3" | "yards3" => tokens.push(Token::Unit(CubicYard)),
"mi3" | "mile3" | "miles3" => tokens.push(Token::Unit(CubicMile)),
_ => {},
}
} else {
let string = &input[start_index..=end_index]; let string = &input[start_index..=end_index];
let string: &str = &string.replacen("square", "sq", 1); let string: &str = &string.replacen("square", "sq", 1);
match string { match string {
@ -272,10 +316,11 @@ pub fn lex(input: &str) -> Result<TokenVector, String> {
return Err(format!("Invalid string: {}", string)); return Err(format!("Invalid string: {}", string));
} }
} }
}
}, },
'.' | '0'..='9' => { '.' | '0'..='9' => {
let start_index = byte_index; let start_index = byte_index;
let mut end_index = byte_index; let mut end_index = byte_index;
while let Some(current_char) = chars.peek() { while let Some(current_char) = chars.peek() {
@ -294,11 +339,11 @@ pub fn lex(input: &str) -> Result<TokenVector, String> {
if d128::get_status().is_empty() { if d128::get_status().is_empty() {
tokens.push(Token::Number(number)); tokens.push(Token::Number(number));
} else { } else {
return Err(format!("Error parsing d128 number: {}", number_string)); return Err(format!("Error lexing d128 number: {}", number_string));
} }
}, },
Err(_e) => { Err(_e) => {
return Err(format!("Error parsing d128 number: {}", number_string)); return Err(format!("Error lexing d128 number: {}", number_string));
} }
}; };