Add parsing to floats
This commit is contained in:
		
							parent
							
								
									96947be97a
								
							
						
					
					
						commit
						bcc93dd60c
					
				| @ -24,6 +24,13 @@ pub enum TypeKind { | ||||
|     U32, | ||||
|     U64, | ||||
|     U128, | ||||
|     F16, | ||||
|     F16B, | ||||
|     F32, | ||||
|     F64, | ||||
|     F128, | ||||
|     F80, | ||||
|     F128PPC, | ||||
|     String, | ||||
|     Array(Box<TypeKind>, u64), | ||||
|     Custom(String), | ||||
| @ -33,7 +40,8 @@ pub enum TypeKind { | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
| pub enum Literal { | ||||
|     Number(u64), | ||||
|     Integer(u64), | ||||
|     Decimal(f64), | ||||
|     Bool(bool), | ||||
|     String(String), | ||||
| } | ||||
|  | ||||
| @ -53,6 +53,13 @@ impl Parse for Type { | ||||
|                     "u32" => TypeKind::U32, | ||||
|                     "u64" => TypeKind::U64, | ||||
|                     "u128" => TypeKind::U128, | ||||
|                     "f16" => TypeKind::F16, | ||||
|                     "f16b" => TypeKind::F16B, | ||||
|                     "f32" => TypeKind::F32, | ||||
|                     "f64" => TypeKind::F64, | ||||
|                     "f80" => TypeKind::F80, | ||||
|                     "f128" => TypeKind::F128, | ||||
|                     "f128ppc" => TypeKind::F128PPC, | ||||
|                     "string" => TypeKind::String, | ||||
|                     _ => TypeKind::Custom(ident), | ||||
|                 } | ||||
| @ -148,10 +155,25 @@ impl Parse for PrimaryExpression { | ||||
|                         Expression(Kind::VariableName(v.clone()), stream.get_range().unwrap()) | ||||
|                     } | ||||
|                 } | ||||
|                 Token::DecimalValue(v) => Expression( | ||||
|                     Kind::Literal(Literal::Number(*v)), | ||||
|                     stream.get_range().unwrap(), | ||||
|                 ), | ||||
|                 Token::DecimalValue(v) => { | ||||
|                     if let Some(Token::Dot) = stream.peek() { | ||||
|                         stream.next(); // Consume dot
 | ||||
|                         let Some(Token::DecimalValue(fractional)) = stream.next() else { | ||||
|                             return Err(stream.expected_err("fractional part")?); | ||||
|                         }; | ||||
|                         let log = (fractional as f64).log10().ceil() as u32; | ||||
|                         let value = (*v as f64) + (fractional as f64) / (10u64.pow(log) as f64); | ||||
|                         Expression( | ||||
|                             Kind::Literal(Literal::Decimal(value)), | ||||
|                             stream.get_range_prev().unwrap(), | ||||
|                         ) | ||||
|                     } else { | ||||
|                         Expression( | ||||
|                             Kind::Literal(Literal::Integer(*v)), | ||||
|                             stream.get_range_prev().unwrap(), | ||||
|                         ) | ||||
|                     } | ||||
|                 } | ||||
|                 Token::StringLit(v) => Expression( | ||||
|                     Kind::Literal(Literal::String(v.clone())), | ||||
|                     stream.get_range().unwrap(), | ||||
|  | ||||
| @ -282,9 +282,10 @@ impl ast::BinaryOperator { | ||||
| impl ast::Literal { | ||||
|     fn mir(&self) -> mir::Literal { | ||||
|         match &self { | ||||
|             ast::Literal::Number(v) => mir::Literal::Vague(mir::VagueLiteral::Number(*v)), | ||||
|             ast::Literal::Integer(v) => mir::Literal::Vague(mir::VagueLiteral::Number(*v)), | ||||
|             ast::Literal::Bool(v) => mir::Literal::Bool(*v), | ||||
|             ast::Literal::String(val) => mir::Literal::String(val.clone()), | ||||
|             ast::Literal::Decimal(_) => todo!(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -314,6 +315,13 @@ impl From<ast::TypeKind> for mir::TypeKind { | ||||
|             ast::TypeKind::Ptr(type_kind) => { | ||||
|                 mir::TypeKind::UserPtr(Box::new(mir::TypeKind::from(*type_kind.clone()))) | ||||
|             } | ||||
|             ast::TypeKind::F16 => todo!(), | ||||
|             ast::TypeKind::F16B => todo!(), | ||||
|             ast::TypeKind::F32 => todo!(), | ||||
|             ast::TypeKind::F64 => todo!(), | ||||
|             ast::TypeKind::F128 => todo!(), | ||||
|             ast::TypeKind::F80 => todo!(), | ||||
|             ast::TypeKind::F128PPC => todo!(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -412,7 +412,6 @@ impl Expression { | ||||
| 
 | ||||
|                 let both_t = lhs_type.collapse_into(&rhs_type)?; | ||||
| 
 | ||||
|                 dbg!(&op, &both_t, both_t.signed(), lhs.is_zero(), rhs.is_zero()); | ||||
|                 if *op == BinaryOperator::Minus && !lhs_type.signed() { | ||||
|                     if let (Some(lhs_val), Some(rhs_val)) = (lhs.num_value(), rhs.num_value()) { | ||||
|                         if lhs_val < rhs_val { | ||||
|  | ||||
							
								
								
									
										5
									
								
								reid_src/float.reid
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								reid_src/float.reid
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| // Arithmetic, function calls and imports! | ||||
| 
 | ||||
| fn OneHalf(var1: f32) -> f32 { | ||||
|   return var1 * 1.5; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user