Rough copy of Number and NumberBuilder
This commit is contained in:
parent
59f9b5dd97
commit
9e3d4f155e
1 changed files with 76 additions and 0 deletions
76
src/lexer/number.rs
Normal file
76
src/lexer/number.rs
Normal file
|
@ -0,0 +1,76 @@
|
|||
/* number.rs
|
||||
* Eryn Wells <eryn@erynwells.me>
|
||||
*/
|
||||
|
||||
struct Number {
|
||||
value: f64,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum Radix { Bin, Oct, Dec, Hex }
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct NumberBuilder {
|
||||
exact: bool,
|
||||
radix: Radix,
|
||||
value: f64,
|
||||
}
|
||||
|
||||
impl NumberBuilder {
|
||||
pub fn new() -> NumberBuilder {
|
||||
NumberBuilder {
|
||||
exact: false,
|
||||
radix: Radix::Dec,
|
||||
value: 0.0,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn exact<'a>(&'a mut self, ex: bool) -> &'a mut Self {
|
||||
self.exact = ex;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn radix<'a>(&'a mut self, r: Radix) -> &'a mut Self {
|
||||
self.radix = r;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn resolve(&self) -> Number {
|
||||
// TODO: Convert fields to Number type.
|
||||
Number { value: 0.0 }
|
||||
}
|
||||
|
||||
pub fn extend_value<'a>(&'a mut self, digit: char) -> &'a mut Self {
|
||||
if let Some(place) = NumberBuilder::place_value(digit) {
|
||||
self.value = self.radix.value() * self.value + place;
|
||||
}
|
||||
else {
|
||||
// TODO: Indicate an error.
|
||||
}
|
||||
self
|
||||
}
|
||||
|
||||
pub fn radix_value(&self) -> u32 {
|
||||
self.radix.value() as u32
|
||||
}
|
||||
|
||||
fn place_value(digit: char) -> Option<f64> {
|
||||
match digit {
|
||||
'0' ... '9' => Some((digit as u32 - '0' as u32) as f64),
|
||||
'a' ... 'f' => Some((digit as u32 - 'a' as u32) as f64),
|
||||
'A' ... 'F' => Some((digit as u32 - 'A' as u32) as f64),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Radix {
|
||||
fn value(&self) -> f64 {
|
||||
match *self {
|
||||
Radix::Bin => 2.0,
|
||||
Radix::Oct => 8.0,
|
||||
Radix::Dec => 10.0,
|
||||
Radix::Hex => 16.0,
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue