Add parsing for bitwise or/and, xor and bitshifts
This commit is contained in:
		
							parent
							
								
									63c54ae4da
								
							
						
					
					
						commit
						516833d26f
					
				
							
								
								
									
										10
									
								
								examples/or_bitwise.reid
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								examples/or_bitwise.reid
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | // Arithmetic, function calls and imports! | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | fn main() -> bool { | ||||||
|  |   let bwand = (0xff & 0xf0) >> 4; | ||||||
|  |   let bwor = (0x0f | 0x00) << 4; | ||||||
|  |   let bwxor = (0xf0 | 0x0f); | ||||||
|  | 
 | ||||||
|  |   return (bwxor == 255) && ((value == 15) || false) && (bwor == 240); | ||||||
|  | } | ||||||
							
								
								
									
										7
									
								
								examples/test.reid
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								examples/test.reid
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | // Arithmetic, function calls and imports! | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | fn main() -> bool { | ||||||
|  | 
 | ||||||
|  |   return 5.0 > -1; | ||||||
|  | } | ||||||
| @ -88,6 +88,10 @@ pub enum Token { | |||||||
|     LessThan, |     LessThan, | ||||||
|     /// `&`
 |     /// `&`
 | ||||||
|     Et, |     Et, | ||||||
|  |     /// `|`
 | ||||||
|  |     Pipe, | ||||||
|  |     /// `^`
 | ||||||
|  |     Hat, | ||||||
|     /// `!`
 |     /// `!`
 | ||||||
|     Exclamation, |     Exclamation, | ||||||
| 
 | 
 | ||||||
| @ -174,6 +178,8 @@ impl ToString for Token { | |||||||
|             Token::GreaterThan => String::from('>'), |             Token::GreaterThan => String::from('>'), | ||||||
|             Token::LessThan => String::from('<'), |             Token::LessThan => String::from('<'), | ||||||
|             Token::Et => String::from('&'), |             Token::Et => String::from('&'), | ||||||
|  |             Token::Pipe => String::from('|'), | ||||||
|  |             Token::Hat => String::from('^'), | ||||||
|             Token::Exclamation => String::from('!'), |             Token::Exclamation => String::from('!'), | ||||||
|             Token::ParenOpen => String::from('('), |             Token::ParenOpen => String::from('('), | ||||||
|             Token::ParenClose => String::from(')'), |             Token::ParenClose => String::from(')'), | ||||||
| @ -411,6 +417,8 @@ pub fn tokenize<T: Into<String>>(to_tokenize: T) -> Result<Vec<FullToken>, Error | |||||||
|             '>' => Token::GreaterThan, |             '>' => Token::GreaterThan, | ||||||
|             '<' => Token::LessThan, |             '<' => Token::LessThan, | ||||||
|             '&' => Token::Et, |             '&' => Token::Et, | ||||||
|  |             '|' => Token::Pipe, | ||||||
|  |             '^' => Token::Hat, | ||||||
|             '!' => Token::Exclamation, |             '!' => Token::Exclamation, | ||||||
|             '(' => Token::ParenOpen, |             '(' => Token::ParenOpen, | ||||||
|             ')' => Token::ParenClose, |             ')' => Token::ParenClose, | ||||||
|  | |||||||
| @ -116,7 +116,14 @@ pub enum BinaryOperator { | |||||||
|     Div, |     Div, | ||||||
|     Mod, |     Mod, | ||||||
| 
 | 
 | ||||||
|  |     BitshiftRight, | ||||||
|  |     BitshiftLeft, | ||||||
|  | 
 | ||||||
|     And, |     And, | ||||||
|  |     Or, | ||||||
|  |     Xor, | ||||||
|  |     BWAnd, | ||||||
|  |     BWOr, | ||||||
|     LT, |     LT, | ||||||
|     LE, |     LE, | ||||||
|     GT, |     GT, | ||||||
| @ -126,7 +133,7 @@ pub enum BinaryOperator { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl BinaryOperator { | impl BinaryOperator { | ||||||
|     pub fn get_precedence(&self) -> i8 { |     pub fn get_precedence(&self) -> u8 { | ||||||
|         use BinaryOperator::*; |         use BinaryOperator::*; | ||||||
|         match &self { |         match &self { | ||||||
|             Minus => 5, |             Minus => 5, | ||||||
| @ -134,13 +141,20 @@ impl BinaryOperator { | |||||||
|             Mult => 15, |             Mult => 15, | ||||||
|             Div => 20, |             Div => 20, | ||||||
|             Mod => 20, |             Mod => 20, | ||||||
|             And => 100, |             BWAnd => 90, | ||||||
|             LT => 100, |             BWOr => 90, | ||||||
|             LE => 100, |             BWXor => 90, | ||||||
|             GT => 100, |             BitshiftLeft => 100, | ||||||
|             GE => 100, |             BitshiftRight => 100, | ||||||
|             EQ => 100, |             And => 150, | ||||||
|             NE => 100, |             Or => 150, | ||||||
|  |             Xor => 150, | ||||||
|  |             LT => 150, | ||||||
|  |             LE => 150, | ||||||
|  |             GT => 150, | ||||||
|  |             GE => 150, | ||||||
|  |             EQ => 150, | ||||||
|  |             NE => 150, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -488,6 +488,10 @@ impl Parse for BinaryOperator { | |||||||
|                 stream.next(); |                 stream.next(); | ||||||
|                 BinaryOperator::And |                 BinaryOperator::And | ||||||
|             } |             } | ||||||
|  |             (Some(Token::Pipe), Some(Token::Pipe)) => { | ||||||
|  |                 stream.next(); | ||||||
|  |                 BinaryOperator::Or | ||||||
|  |             } | ||||||
|             (Some(Token::LessThan), Some(Token::Equals)) => { |             (Some(Token::LessThan), Some(Token::Equals)) => { | ||||||
|                 stream.next(); |                 stream.next(); | ||||||
|                 BinaryOperator::LE |                 BinaryOperator::LE | ||||||
| @ -504,6 +508,18 @@ impl Parse for BinaryOperator { | |||||||
|                 stream.next(); |                 stream.next(); | ||||||
|                 BinaryOperator::NE |                 BinaryOperator::NE | ||||||
|             } |             } | ||||||
|  |             (Some(Token::GreaterThan), Some(Token::GreaterThan)) => { | ||||||
|  |                 stream.next(); | ||||||
|  |                 BinaryOperator::BitshiftRight | ||||||
|  |             } | ||||||
|  |             (Some(Token::LessThan), Some(Token::LessThan)) => { | ||||||
|  |                 stream.next(); | ||||||
|  |                 BinaryOperator::BitshiftLeft | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             (Some(Token::Hat), _) => BinaryOperator::Xor, | ||||||
|  |             (Some(Token::Et), _) => BinaryOperator::BWAnd, | ||||||
|  |             (Some(Token::Pipe), _) => BinaryOperator::BWOr, | ||||||
| 
 | 
 | ||||||
|             (Some(Token::LessThan), _) => BinaryOperator::LT, |             (Some(Token::LessThan), _) => BinaryOperator::LT, | ||||||
|             (Some(Token::GreaterThan), _) => BinaryOperator::GT, |             (Some(Token::GreaterThan), _) => BinaryOperator::GT, | ||||||
|  | |||||||
| @ -455,6 +455,12 @@ impl ast::BinaryOperator { | |||||||
|             ast::BinaryOperator::GE => mir::BinaryOperator::Cmp(mir::CmpOperator::GE), |             ast::BinaryOperator::GE => mir::BinaryOperator::Cmp(mir::CmpOperator::GE), | ||||||
|             ast::BinaryOperator::EQ => mir::BinaryOperator::Cmp(mir::CmpOperator::EQ), |             ast::BinaryOperator::EQ => mir::BinaryOperator::Cmp(mir::CmpOperator::EQ), | ||||||
|             ast::BinaryOperator::NE => mir::BinaryOperator::Cmp(mir::CmpOperator::NE), |             ast::BinaryOperator::NE => mir::BinaryOperator::Cmp(mir::CmpOperator::NE), | ||||||
|  |             ast::BinaryOperator::BitshiftRight => todo!(), | ||||||
|  |             ast::BinaryOperator::BitshiftLeft => todo!(), | ||||||
|  |             ast::BinaryOperator::Or => todo!(), | ||||||
|  |             ast::BinaryOperator::Xor => todo!(), | ||||||
|  |             ast::BinaryOperator::BWAnd => todo!(), | ||||||
|  |             ast::BinaryOperator::BWOr => todo!(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -135,7 +135,14 @@ impl TypeKind { | |||||||
|                 | TypeKind::U16 |                 | TypeKind::U16 | ||||||
|                 | TypeKind::U32 |                 | TypeKind::U32 | ||||||
|                 | TypeKind::U64 |                 | TypeKind::U64 | ||||||
|                 | TypeKind::U128 => Ok(other.clone()), |                 | TypeKind::U128 | ||||||
|  |                 | TypeKind::F16 | ||||||
|  |                 | TypeKind::F32B | ||||||
|  |                 | TypeKind::F32 | ||||||
|  |                 | TypeKind::F64 | ||||||
|  |                 | TypeKind::F80 | ||||||
|  |                 | TypeKind::F128 | ||||||
|  |                 | TypeKind::F128PPC => Ok(other.clone()), | ||||||
|                 _ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())), |                 _ => Err(ErrorKind::TypesIncompatible(self.clone(), other.clone())), | ||||||
|             }, |             }, | ||||||
|             (TypeKind::Vague(Vague::Decimal), other) | (other, TypeKind::Vague(Vague::Decimal)) => match other { |             (TypeKind::Vague(Vague::Decimal), other) | (other, TypeKind::Vague(Vague::Decimal)) => match other { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user