Support for writing multidimensional lenghts as km2 etc
This commit is contained in:
parent
388825f9ac
commit
adaf4eb4ac
51
src/lexer.rs
51
src/lexer.rs
@ -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));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user