[lexer] Add number::Sign state
This commit is contained in:
parent
663ae3a9f1
commit
eabc8f98e8
3 changed files with 60 additions and 5 deletions
|
@ -18,5 +18,9 @@ impl Error {
|
||||||
Error::new(format!("invalid character: {}", c))
|
Error::new(format!("invalid character: {}", c))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn unexpected_eof() -> Error {
|
||||||
|
Error::new("unexpected EOF".to_string())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn msg(&self) -> &str { &self.message }
|
pub fn msg(&self) -> &str { &self.message }
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,11 @@
|
||||||
* Eryn Wells <eryn@erynwells.me>
|
* Eryn Wells <eryn@erynwells.me>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use chars::Lexable;
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use states::{State, StateResult};
|
use states::{State, StateResult};
|
||||||
use states::number::{Radix, Exact};
|
use states::number::{Builder, Radix, Exact};
|
||||||
use states::number::Builder;
|
use states::number::sign::Sign;
|
||||||
use token::Token;
|
use token::Token;
|
||||||
|
|
||||||
#[derive(Debug)] pub struct Prefix(Builder);
|
#[derive(Debug)] pub struct Prefix(Builder);
|
||||||
|
@ -31,9 +32,12 @@ impl Prefix {
|
||||||
|
|
||||||
impl State for Prefix {
|
impl State for Prefix {
|
||||||
fn lex(&mut self, c: char) -> StateResult {
|
fn lex(&mut self, c: char) -> StateResult {
|
||||||
match c {
|
if c.is_hash() {
|
||||||
'#' => StateResult::advance(Box::new(Hash(self.0))),
|
StateResult::advance(Box::new(Hash(self.0)))
|
||||||
_ => StateResult::fail(Error::invalid_char(c))
|
} else if let Some(sn) = Sign::with_char(self.0, c) {
|
||||||
|
StateResult::advance(Box::new(sn))
|
||||||
|
} else {
|
||||||
|
StateResult::fail(Error::invalid_char(c))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
47
lexer/src/states/number/sign.rs
Normal file
47
lexer/src/states/number/sign.rs
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
/* lexer/src/states/number/sign.rs
|
||||||
|
* Eryn Wells <eryn@erynwells.me>
|
||||||
|
*/
|
||||||
|
|
||||||
|
use error::Error;
|
||||||
|
use states::{State, StateResult};
|
||||||
|
use states::number::Builder;
|
||||||
|
use states::number::Sign as Sgn;
|
||||||
|
use token::Token;
|
||||||
|
|
||||||
|
#[derive(Debug)] pub struct Sign(Builder);
|
||||||
|
|
||||||
|
impl Sign {
|
||||||
|
pub fn new(b: Builder) -> Sign {
|
||||||
|
Sign(b)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_char(b: Builder, c: char) -> Option<Sign> {
|
||||||
|
if !b.seen_sign() {
|
||||||
|
match c {
|
||||||
|
'+' => {
|
||||||
|
let mut b = b.clone();
|
||||||
|
b.push_sign(Sgn::Pos);
|
||||||
|
Some(Sign::new(b))
|
||||||
|
},
|
||||||
|
'-' => {
|
||||||
|
let mut b = b.clone();
|
||||||
|
b.push_sign(Sgn::Neg);
|
||||||
|
Some(Sign::new(b))
|
||||||
|
},
|
||||||
|
_ => None
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl State for Sign {
|
||||||
|
fn lex(&mut self, c: char) -> StateResult {
|
||||||
|
StateResult::fail(Error::invalid_char(c))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn none(&mut self) -> Result<Option<Token>, Error> {
|
||||||
|
Err(Error::unexpected_eof())
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue