improve number lexing (temporarily breaking function lexing)
This commit is contained in:
		
							parent
							
								
									adf97d4b20
								
							
						
					
					
						commit
						cbf35e9746
					
				
					 1 changed files with 19 additions and 15 deletions
				
			
		| 
						 | 
					@ -156,7 +156,8 @@ enum ParseErr {
 | 
				
			||||||
struct Lexer<'a> {
 | 
					struct Lexer<'a> {
 | 
				
			||||||
	data: &'a str,
 | 
						data: &'a str,
 | 
				
			||||||
	data_ptr: &'a str,
 | 
						data_ptr: &'a str,
 | 
				
			||||||
	idx: usize,
 | 
						// idx: usize,
 | 
				
			||||||
 | 
						next_by: usize,
 | 
				
			||||||
	next_tok: Result<Token, ParseErr>,
 | 
						next_tok: Result<Token, ParseErr>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -164,20 +165,18 @@ struct Lexer<'a> {
 | 
				
			||||||
impl Lexer<'_> {
 | 
					impl Lexer<'_> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn new(data: &str) -> Lexer<'_> {
 | 
						fn new(data: &str) -> Lexer<'_> {
 | 
				
			||||||
		let mut n: Lexer = Lexer {data, data_ptr: data, idx: 0, next_tok: Err(ParseErr::Eof)};
 | 
							let mut n: Lexer = Lexer {data, data_ptr: data, next_by: 0, next_tok: Err(ParseErr::Eof)};
 | 
				
			||||||
		n.next();
 | 
							n.next();
 | 
				
			||||||
		debug!("New finished!");
 | 
							debug!("New finished!");
 | 
				
			||||||
		n
 | 
							n
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	fn _next(&mut self) -> Result<Token, ParseErr> {
 | 
						fn _next(&mut self) -> Result<Token, ParseErr> {
 | 
				
			||||||
		match self.data.chars().nth(self.idx) {
 | 
							self.data_ptr = &self.data_ptr[self.next_by..];
 | 
				
			||||||
 | 
							match self.data_ptr.chars().nth(0) {
 | 
				
			||||||
			Some(val) => {
 | 
								Some(val) => {
 | 
				
			||||||
				debug!("lexing char '{}' at idx {}", val, self.idx);
 | 
									debug!("lexing char '{}' at idx {}", val, self.data.chars().count() - self.data_ptr.chars().count());
 | 
				
			||||||
				// debug!("current char '{}'", self.data.chars().nth(0).unwrap());
 | 
									self.next_by = 1;
 | 
				
			||||||
				self.idx += 1;
 | 
					 | 
				
			||||||
				// TODO: make more efficient
 | 
					 | 
				
			||||||
				self.data_ptr = &self.data[self.idx..];
 | 
					 | 
				
			||||||
				match val {
 | 
									match val {
 | 
				
			||||||
					'+' => Ok(Token::Op(Op::Add)),
 | 
										'+' => Ok(Token::Op(Op::Add)),
 | 
				
			||||||
					'-' => Ok(Token::Op(Op::Subtract)),
 | 
										'-' => Ok(Token::Op(Op::Subtract)),
 | 
				
			||||||
| 
						 | 
					@ -187,18 +186,20 @@ impl Lexer<'_> {
 | 
				
			||||||
					'(' => Ok(Token::Op(Op::LParen)),
 | 
										'(' => Ok(Token::Op(Op::LParen)),
 | 
				
			||||||
					')' => Ok(Token::Op(Op::RParen)),
 | 
										')' => Ok(Token::Op(Op::RParen)),
 | 
				
			||||||
					_ if val.is_whitespace() => self._next(),
 | 
										_ if val.is_whitespace() => self._next(),
 | 
				
			||||||
					// TODO: maybe parse '-' as part of number so I can do '1 + -1' and similar
 | 
					 | 
				
			||||||
					_ if val.is_digit(10) => {
 | 
										_ if val.is_digit(10) => {
 | 
				
			||||||
						let start = self.idx - 1;
 | 
											let mut len: usize = 0;
 | 
				
			||||||
 | 
											self.data_ptr.chars().take_while(|c| c.is_digit(10) || *c == '.').for_each(|_| len += 1);
 | 
				
			||||||
 | 
											self.next_by += len - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						self.data_ptr.chars().take_while(|c| c.is_digit(10)).for_each(|_| self.idx += 1);//.next().unwrap_or(' ').is_digit(10) {self.idx += 1;}
 | 
											match self.data_ptr[..len].parse() {
 | 
				
			||||||
 | 
					 | 
				
			||||||
						match self.data[start..self.idx].parse() {
 | 
					 | 
				
			||||||
							Ok(val) => Ok(Token::Atom(Atom::Number(val))),
 | 
												Ok(val) => Ok(Token::Atom(Atom::Number(val))),
 | 
				
			||||||
							Err(e) => Err(ParseErr::Invalid),
 | 
												Err(e) => Err(ParseErr::Invalid),
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
					},
 | 
										},
 | 
				
			||||||
					_ => {
 | 
										_ => {
 | 
				
			||||||
 | 
					/*						match (&self.data[self.idx - 1..]) {
 | 
				
			||||||
 | 
												s if s.starts_with(""
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
						let mut l: usize;
 | 
											let mut l: usize;
 | 
				
			||||||
						l = matches(&self.data[self.idx - 1..], "sin");
 | 
											l = matches(&self.data[self.idx - 1..], "sin");
 | 
				
			||||||
						if l != 0 {
 | 
											if l != 0 {
 | 
				
			||||||
| 
						 | 
					@ -235,13 +236,16 @@ impl Lexer<'_> {
 | 
				
			||||||
							self.idx += l;
 | 
												self.idx += l;
 | 
				
			||||||
							return Ok(Token::Op(Op::Func(Func::SquareRoot)));
 | 
												return Ok(Token::Op(Op::Func(Func::SquareRoot)));
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
						debug!("got invalid char '{}'", val);
 | 
											debug!("got invalid char '{}'", val);
 | 
				
			||||||
						Err(ParseErr::Invalid)
 | 
											Err(ParseErr::Invalid)
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			None => Err(ParseErr::Eof),
 | 
								None => {
 | 
				
			||||||
 | 
									self.next_by = 0;
 | 
				
			||||||
 | 
									Err(ParseErr::Eof)
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue