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, | ||||
|     /// `&`
 | ||||
|     Et, | ||||
|     /// `|`
 | ||||
|     Pipe, | ||||
|     /// `^`
 | ||||
|     Hat, | ||||
|     /// `!`
 | ||||
|     Exclamation, | ||||
| 
 | ||||
| @ -174,6 +178,8 @@ impl ToString for Token { | ||||
|             Token::GreaterThan => String::from('>'), | ||||
|             Token::LessThan => String::from('<'), | ||||
|             Token::Et => String::from('&'), | ||||
|             Token::Pipe => String::from('|'), | ||||
|             Token::Hat => String::from('^'), | ||||
|             Token::Exclamation => String::from('!'), | ||||
|             Token::ParenOpen => 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::LessThan, | ||||
|             '&' => Token::Et, | ||||
|             '|' => Token::Pipe, | ||||
|             '^' => Token::Hat, | ||||
|             '!' => Token::Exclamation, | ||||
|             '(' => Token::ParenOpen, | ||||
|             ')' => Token::ParenClose, | ||||
|  | ||||
| @ -116,7 +116,14 @@ pub enum BinaryOperator { | ||||
|     Div, | ||||
|     Mod, | ||||
| 
 | ||||
|     BitshiftRight, | ||||
|     BitshiftLeft, | ||||
| 
 | ||||
|     And, | ||||
|     Or, | ||||
|     Xor, | ||||
|     BWAnd, | ||||
|     BWOr, | ||||
|     LT, | ||||
|     LE, | ||||
|     GT, | ||||
| @ -126,7 +133,7 @@ pub enum BinaryOperator { | ||||
| } | ||||
| 
 | ||||
| impl BinaryOperator { | ||||
|     pub fn get_precedence(&self) -> i8 { | ||||
|     pub fn get_precedence(&self) -> u8 { | ||||
|         use BinaryOperator::*; | ||||
|         match &self { | ||||
|             Minus => 5, | ||||
| @ -134,13 +141,20 @@ impl BinaryOperator { | ||||
|             Mult => 15, | ||||
|             Div => 20, | ||||
|             Mod => 20, | ||||
|             And => 100, | ||||
|             LT => 100, | ||||
|             LE => 100, | ||||
|             GT => 100, | ||||
|             GE => 100, | ||||
|             EQ => 100, | ||||
|             NE => 100, | ||||
|             BWAnd => 90, | ||||
|             BWOr => 90, | ||||
|             BWXor => 90, | ||||
|             BitshiftLeft => 100, | ||||
|             BitshiftRight => 100, | ||||
|             And => 150, | ||||
|             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(); | ||||
|                 BinaryOperator::And | ||||
|             } | ||||
|             (Some(Token::Pipe), Some(Token::Pipe)) => { | ||||
|                 stream.next(); | ||||
|                 BinaryOperator::Or | ||||
|             } | ||||
|             (Some(Token::LessThan), Some(Token::Equals)) => { | ||||
|                 stream.next(); | ||||
|                 BinaryOperator::LE | ||||
| @ -504,6 +508,18 @@ impl Parse for BinaryOperator { | ||||
|                 stream.next(); | ||||
|                 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::GreaterThan), _) => BinaryOperator::GT, | ||||
|  | ||||
| @ -455,6 +455,12 @@ impl ast::BinaryOperator { | ||||
|             ast::BinaryOperator::GE => mir::BinaryOperator::Cmp(mir::CmpOperator::GE), | ||||
|             ast::BinaryOperator::EQ => mir::BinaryOperator::Cmp(mir::CmpOperator::EQ), | ||||
|             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::U32 | ||||
|                 | 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())), | ||||
|             }, | ||||
|             (TypeKind::Vague(Vague::Decimal), other) | (other, TypeKind::Vague(Vague::Decimal)) => match other { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user