mirror of
				https://github.com/rm-dr/daisy
				synced 2025-10-30 14:04:47 -07:00 
			
		
		
		
	Removed Root Token
This commit is contained in:
		| @ -1,3 +1,5 @@ | ||||
| use std::collections::VecDeque; | ||||
|  | ||||
| use crate::parser::Token; | ||||
| use crate::parser::LineLocation; | ||||
| use crate::parser::ParserError; | ||||
| @ -15,7 +17,6 @@ fn get_at_coords<'a>(g: &'a mut Token, coords: &Vec<usize>) -> &'a mut Token { | ||||
| 			Token::Negative(ref mut v) => v, | ||||
| 			Token::Power(ref mut v) => v, | ||||
| 			Token::Modulo(ref mut v) => v, | ||||
| 			Token::Root(ref mut v) => v, | ||||
| 			_ => panic!() | ||||
| 		}; | ||||
|  | ||||
| @ -36,19 +37,19 @@ pub fn p_evaluate( | ||||
|  | ||||
| 		let mut h = &mut g; | ||||
| 		for t in coords.iter() { | ||||
| 			let inner = match h { | ||||
| 				Token::Multiply(ref mut v) => v, | ||||
| 				Token::Divide(ref mut v) => v, | ||||
| 				Token::Add(ref mut v) => v, | ||||
| 				Token::Factorial(ref mut v) => v, | ||||
| 				Token::Negative(ref mut v) => v, | ||||
| 				Token::Power(ref mut v) => v, | ||||
| 				Token::Modulo(ref mut v) => v, | ||||
| 				Token::Root(ref mut v) => v, | ||||
| 				_ => panic!() | ||||
| 			let inner: Option<&mut VecDeque<Token>> = match h { | ||||
| 				Token::Multiply(ref mut v) | ||||
| 				| Token::Divide(ref mut v) | ||||
| 				| Token::Add(ref mut v) | ||||
| 				| Token::Factorial(ref mut v) | ||||
| 				| Token::Negative(ref mut v) | ||||
| 				| Token::Power(ref mut v) | ||||
| 				| Token::Modulo(ref mut v) | ||||
| 				=> Some(v), | ||||
| 				_ => None | ||||
| 			}; | ||||
|  | ||||
| 			if *t >= inner.len() { | ||||
| 			if inner.is_none() || *t >= inner.as_ref().unwrap().len() { | ||||
| 				coords.pop(); | ||||
| 				if coords.len() == 0 { break 'outer; } | ||||
|  | ||||
| @ -62,7 +63,7 @@ pub fn p_evaluate( | ||||
| 				continue 'outer; | ||||
| 			} | ||||
|  | ||||
| 			h = &mut inner[*t]; | ||||
| 			h = &mut inner.unwrap()[*t]; | ||||
| 		} | ||||
|  | ||||
| 		match h { | ||||
| @ -90,8 +91,7 @@ pub fn p_evaluate( | ||||
| 			Token::PreOperator(_,_) | | ||||
| 			Token::PreGroup(_,_) | | ||||
| 			Token::PreGroupStart(_) | | ||||
| 			Token::PreGroupEnd(_) | | ||||
| 			Token::Root(_) | ||||
| 			Token::PreGroupEnd(_) | ||||
| 			=> panic!() | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| @ -141,5 +141,5 @@ pub fn p_groupify(mut g: VecDeque<Token>) -> Result<Token, (LineLocation, Parser | ||||
| 	} | ||||
|  | ||||
| 	let (_, v) = levels.pop().unwrap(); | ||||
| 	return Ok(Token::Root(v)); | ||||
| 	return Ok(Token::PreGroup(LineLocation{pos:0, len:0}, v)); | ||||
| } | ||||
| @ -123,8 +123,8 @@ fn treeify_binary( | ||||
| 			let mut left = g_inner.remove(i-1).unwrap(); | ||||
| 			let this = g_inner.remove(i-1).unwrap(); | ||||
| 			let mut right = g_inner.remove(i-1).unwrap(); | ||||
| 			if let Token::PreGroup(_, _) = right { right = inner_treeify(right)?; } | ||||
| 			if let Token::PreGroup(_, _) = left { left = inner_treeify(left)?; } | ||||
| 			if let Token::PreGroup(_, _) = right { right = p_treeify(right)?; } | ||||
| 			if let Token::PreGroup(_, _) = left { left = p_treeify(left)?; } | ||||
|  | ||||
| 			let k = match this { | ||||
| 				Token::PreOperator(_, k) => k, | ||||
| @ -218,7 +218,7 @@ fn treeify_unaryleft( | ||||
| 		if right_val.is_none() || this_val > right_val.unwrap() { | ||||
| 			let this = g_inner.remove(i).unwrap(); | ||||
| 			let mut right = g_inner.remove(i).unwrap(); | ||||
| 			if let Token::PreGroup(_, _) = right { right = inner_treeify(right)?; } | ||||
| 			if let Token::PreGroup(_, _) = right { right = p_treeify(right)?; } | ||||
|  | ||||
| 			let k = match this { | ||||
| 				Token::PreOperator(_, k) => k, | ||||
| @ -318,7 +318,7 @@ fn treeify_unaryright( | ||||
| 		if left_val.is_none() || this_val > left_val.unwrap() { | ||||
| 			let this = g_inner.remove(i).unwrap(); | ||||
| 			let mut left = g_inner.remove(i-1).unwrap(); | ||||
| 			if let Token::PreGroup(_, _) = left { left = inner_treeify(left)?; } | ||||
| 			if let Token::PreGroup(_, _) = left { left = p_treeify(left)?; } | ||||
|  | ||||
| 			let k = match this { | ||||
| 				Token::PreOperator(_, k) => k, | ||||
| @ -341,12 +341,12 @@ fn treeify_unaryright( | ||||
| 	}; | ||||
| } | ||||
|  | ||||
| fn inner_treeify( | ||||
| pub fn p_treeify( | ||||
| 	mut g: Token, | ||||
| ) -> Result<Token, (LineLocation, ParserError)> { | ||||
|  | ||||
| 	let g_inner: &mut VecDeque<Token> = match g { | ||||
| 		Token::Root(ref mut x) => x, | ||||
| 		Token::PreGroup(_, ref mut x) => x, | ||||
| 		_ => panic!() | ||||
| 	}; | ||||
|  | ||||
| @ -386,19 +386,10 @@ fn inner_treeify( | ||||
| 			return Err((l, ParserError::Syntax)); | ||||
| 		}, | ||||
| 		Token::PreGroup(_,_) => { | ||||
| 			g = inner_treeify(g)?; | ||||
| 			g = p_treeify(g)?; | ||||
| 		} | ||||
| 		_ => {} | ||||
| 	}; | ||||
|  | ||||
| 	return Ok(g); | ||||
| } | ||||
|  | ||||
| pub fn p_treeify( | ||||
| 	mut g: Token, | ||||
| ) -> Result<Token, (LineLocation, ParserError)> { | ||||
| 	let mut v: VecDeque<Token> = VecDeque::new(); | ||||
| 	v.push_back(inner_treeify(g)?); | ||||
| 	g = Token::Root(v); | ||||
| 	return Ok(g); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user