[lexer] Pass Builders around by reference instead of implicitly Copying

This commit is contained in:
Eryn Wells 2018-09-06 17:21:30 -07:00
parent 9365e51893
commit 15e275513d
6 changed files with 16 additions and 10 deletions

View file

@ -35,7 +35,7 @@ impl State for Begin {
StateResult::advance(Box::new(IdSub{})) StateResult::advance(Box::new(IdSub{}))
} else if c.is_hash() { } else if c.is_hash() {
StateResult::advance(Box::new(Hash::new())) StateResult::advance(Box::new(Hash::new()))
} else if let Some(st) = Digit::with_char(Builder::new(), c) { } else if let Some(st) = Digit::with_char(&Builder::new(), c) {
StateResult::advance(Box::new(st)) StateResult::advance(Box::new(st))
} else { } else {
StateResult::fail(Error::invalid_char(c)) StateResult::fail(Error::invalid_char(c))

View file

@ -28,7 +28,7 @@ impl State for Hash {
StateResult::advance(Box::new(Bool::new(buf.as_str()))) StateResult::advance(Box::new(Bool::new(buf.as_str())))
}, },
c if c.is_radix() || c.is_exactness() => { c if c.is_radix() || c.is_exactness() => {
if let Some(st) = Prefix::with_char(Builder::new(), c) { if let Some(st) = Prefix::with_char(&Builder::new(), c) {
StateResult::advance(Box::new(st)) StateResult::advance(Box::new(st))
} else { } else {
StateResult::fail(Error::new(format!("invalid numeric prefix character: {}", c))) StateResult::fail(Error::new(format!("invalid numeric prefix character: {}", c)))

View file

@ -15,7 +15,7 @@ impl Digit {
Digit(b) Digit(b)
} }
pub fn with_char(b: Builder, c: char) -> Option<Digit> { pub fn with_char(b: &Builder, c: char) -> Option<Digit> {
let mut b = b.clone(); let mut b = b.clone();
if !b.seen_radix() { if !b.seen_radix() {
b.push_radix(Radix::Dec); b.push_radix(Radix::Dec);

View file

@ -20,7 +20,7 @@ pub enum Sign { Neg = -1, Pos = 1 }
#[derive(Copy, Clone, Debug, Eq, PartialEq)] #[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum Exact { Yes, No } pub enum Exact { Yes, No }
#[derive(Copy, Clone, Debug)] #[derive(Clone, Debug)]
pub struct Builder { pub struct Builder {
radix: Option<Radix>, radix: Option<Radix>,
sign: Option<Sign>, sign: Option<Sign>,

View file

@ -18,7 +18,7 @@ impl Prefix {
Prefix(b) Prefix(b)
} }
pub fn with_char(b: Builder, c: char) -> Option<Prefix> { pub fn with_char(b: &Builder, c: char) -> Option<Prefix> {
if let Some(ex) = Exact::from(c) { if let Some(ex) = Exact::from(c) {
if b.seen_exact() { if b.seen_exact() {
return None; return None;
@ -42,10 +42,10 @@ impl Prefix {
impl State for Prefix { impl State for Prefix {
fn lex(&mut self, c: char) -> StateResult { fn lex(&mut self, c: char) -> StateResult {
if c.is_hash() { if c.is_hash() {
StateResult::advance(Box::new(Hash(self.0))) StateResult::advance(Box::new(Hash::new(&self.0)))
} else if let Some(st) = Sign::with_char(self.0, c) { } else if let Some(st) = Sign::with_char(&self.0, c) {
StateResult::advance(Box::new(st)) StateResult::advance(Box::new(st))
} else if let Some(st) = Digit::with_char(self.0, c) { } else if let Some(st) = Digit::with_char(&self.0, c) {
StateResult::advance(Box::new(st)) StateResult::advance(Box::new(st))
} else { } else {
StateResult::fail(Error::invalid_char(c)) StateResult::fail(Error::invalid_char(c))
@ -57,9 +57,15 @@ impl State for Prefix {
} }
} }
impl Hash {
fn new(b: &Builder) -> Hash {
Hash(b.clone())
}
}
impl State for Hash { impl State for Hash {
fn lex(&mut self, c: char) -> StateResult { fn lex(&mut self, c: char) -> StateResult {
if let Some(st) = Prefix::with_char(self.0, c) { if let Some(st) = Prefix::with_char(&self.0, c) {
StateResult::advance(Box::new(st)) StateResult::advance(Box::new(st))
} else { } else {
StateResult::fail(Error::invalid_char(c)) StateResult::fail(Error::invalid_char(c))

View file

@ -15,7 +15,7 @@ impl Sign {
Sign(b) Sign(b)
} }
pub fn with_char(b: Builder, c: char) -> Option<Sign> { pub fn with_char(b: &Builder, c: char) -> Option<Sign> {
if !b.seen_sign() { if !b.seen_sign() {
match c { match c {
'+' => { '+' => {