[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)) | ||||
|     } | ||||
| 
 | ||||
|     pub fn unexpected_eof() -> Error { | ||||
|         Error::new("unexpected EOF".to_string()) | ||||
|     } | ||||
| 
 | ||||
|     pub fn msg(&self) -> &str { &self.message } | ||||
| } | ||||
|  |  | |||
|  | @ -2,10 +2,11 @@ | |||
|  * Eryn Wells <eryn@erynwells.me> | ||||
|  */ | ||||
| 
 | ||||
| use chars::Lexable; | ||||
| use error::Error; | ||||
| use states::{State, StateResult}; | ||||
| use states::number::{Radix, Exact}; | ||||
| use states::number::Builder; | ||||
| use states::number::{Builder, Radix, Exact}; | ||||
| use states::number::sign::Sign; | ||||
| use token::Token; | ||||
| 
 | ||||
| #[derive(Debug)] pub struct Prefix(Builder); | ||||
|  | @ -31,9 +32,12 @@ impl Prefix { | |||
| 
 | ||||
| impl State for Prefix { | ||||
|     fn lex(&mut self, c: char) -> StateResult { | ||||
|         match c { | ||||
|             '#' => StateResult::advance(Box::new(Hash(self.0))), | ||||
|             _ => StateResult::fail(Error::invalid_char(c)) | ||||
|         if c.is_hash() { | ||||
|             StateResult::advance(Box::new(Hash(self.0))) | ||||
|         } 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