Improve typed literal parsing somewhat
This commit is contained in:
		
							parent
							
								
									f2ea749566
								
							
						
					
					
						commit
						dbd539fb76
					
				| @ -96,30 +96,69 @@ impl Parse for UnaryOperator { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | fn specific_float_lit(value: f64, stream: &mut TokenStream) -> Result<Expression, Error> { | ||||||
|  |     use ExpressionKind as Kind; | ||||||
|  | 
 | ||||||
|  |     let specific_lit = if let Ok(ty) = stream.parse::<Type>() { | ||||||
|  |         dbg!(&ty); | ||||||
|  |         match ty.0 { | ||||||
|  |             TypeKind::F16 => Some(SpecificLiteral::F16(value as f32)), | ||||||
|  |             TypeKind::F32 => Some(SpecificLiteral::F32(value as f32)), | ||||||
|  |             TypeKind::F32B => Some(SpecificLiteral::F32B(value as f32)), | ||||||
|  |             TypeKind::F64 => Some(SpecificLiteral::F64(value as f64)), | ||||||
|  |             TypeKind::F128 => Some(SpecificLiteral::F128(value as f64)), | ||||||
|  |             TypeKind::F80 => Some(SpecificLiteral::F80(value as f64)), | ||||||
|  |             TypeKind::F128PPC => Some(SpecificLiteral::F128PPC(value as f64)), | ||||||
|  |             TypeKind::Array(..) => None, | ||||||
|  |             TypeKind::Ptr(..) => None, | ||||||
|  |             TypeKind::Custom(..) => None, | ||||||
|  |             TypeKind::Borrow(..) => None, | ||||||
|  |             _ => return Err(stream.expected_err("integer-compatible type")?), | ||||||
|  |         } | ||||||
|  |     } else { | ||||||
|  |         None | ||||||
|  |     }; | ||||||
|  |     Ok(if let Some(lit) = specific_lit { | ||||||
|  |         Expression( | ||||||
|  |             Kind::Literal(Literal::Specific(lit)), | ||||||
|  |             stream.get_range().unwrap(), | ||||||
|  |         ) | ||||||
|  |     } else { | ||||||
|  |         Expression( | ||||||
|  |             Kind::Literal(Literal::Decimal(value)), | ||||||
|  |             stream.get_range().unwrap(), | ||||||
|  |         ) | ||||||
|  |     }) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| fn specific_int_lit(value: u128, stream: &mut TokenStream) -> Result<Expression, Error> { | fn specific_int_lit(value: u128, stream: &mut TokenStream) -> Result<Expression, Error> { | ||||||
|     use ExpressionKind as Kind; |     use ExpressionKind as Kind; | ||||||
| 
 | 
 | ||||||
|     let specific_lit = if let Ok(ty) = stream.parse::<Type>() { |     let specific_lit = if let Ok(ty) = stream.parse::<Type>() { | ||||||
|         Some(match ty.0 { |         match ty.0 { | ||||||
|             TypeKind::I8 => SpecificLiteral::I8(value as i8), |             TypeKind::I8 => Some(SpecificLiteral::I8(value as i8)), | ||||||
|             TypeKind::I16 => SpecificLiteral::I16(value as i16), |             TypeKind::I16 => Some(SpecificLiteral::I16(value as i16)), | ||||||
|             TypeKind::I32 => SpecificLiteral::I32(value as i32), |             TypeKind::I32 => Some(SpecificLiteral::I32(value as i32)), | ||||||
|             TypeKind::I64 => SpecificLiteral::I64(value as i64), |             TypeKind::I64 => Some(SpecificLiteral::I64(value as i64)), | ||||||
|             TypeKind::I128 => SpecificLiteral::I128(value as i128), |             TypeKind::I128 => Some(SpecificLiteral::I128(value as i128)), | ||||||
|             TypeKind::U8 => SpecificLiteral::U8(value as u8), |             TypeKind::U8 => Some(SpecificLiteral::U8(value as u8)), | ||||||
|             TypeKind::U16 => SpecificLiteral::U16(value as u16), |             TypeKind::U16 => Some(SpecificLiteral::U16(value as u16)), | ||||||
|             TypeKind::U32 => SpecificLiteral::U32(value as u32), |             TypeKind::U32 => Some(SpecificLiteral::U32(value as u32)), | ||||||
|             TypeKind::U64 => SpecificLiteral::U64(value as u64), |             TypeKind::U64 => Some(SpecificLiteral::U64(value as u64)), | ||||||
|             TypeKind::U128 => SpecificLiteral::U128(value as u128), |             TypeKind::U128 => Some(SpecificLiteral::U128(value as u128)), | ||||||
|             TypeKind::F16 => SpecificLiteral::F16(value as f32), |             TypeKind::F16 => Some(SpecificLiteral::F16(value as f32)), | ||||||
|             TypeKind::F32 => SpecificLiteral::F32(value as f32), |             TypeKind::F32 => Some(SpecificLiteral::F32(value as f32)), | ||||||
|             TypeKind::F32B => SpecificLiteral::F32B(value as f32), |             TypeKind::F32B => Some(SpecificLiteral::F32B(value as f32)), | ||||||
|             TypeKind::F64 => SpecificLiteral::F64(value as f64), |             TypeKind::F64 => Some(SpecificLiteral::F64(value as f64)), | ||||||
|             TypeKind::F128 => SpecificLiteral::F128(value as f64), |             TypeKind::F128 => Some(SpecificLiteral::F128(value as f64)), | ||||||
|             TypeKind::F80 => SpecificLiteral::F80(value as f64), |             TypeKind::F80 => Some(SpecificLiteral::F80(value as f64)), | ||||||
|             TypeKind::F128PPC => SpecificLiteral::F128PPC(value as f64), |             TypeKind::F128PPC => Some(SpecificLiteral::F128PPC(value as f64)), | ||||||
|  |             TypeKind::Array(..) => None, | ||||||
|  |             TypeKind::Ptr(..) => None, | ||||||
|  |             TypeKind::Custom(..) => None, | ||||||
|  |             TypeKind::Borrow(..) => None, | ||||||
|             _ => return Err(stream.expected_err("integer-compatible type")?), |             _ => return Err(stream.expected_err("integer-compatible type")?), | ||||||
|         }) |         } | ||||||
|     } else { |     } else { | ||||||
|         None |         None | ||||||
|     }; |     }; | ||||||
| @ -227,31 +266,9 @@ impl Parse for PrimaryExpression { | |||||||
|                             .parse() |                             .parse() | ||||||
|                             .expect("Decimal is not parseable as f64!"); |                             .expect("Decimal is not parseable as f64!"); | ||||||
| 
 | 
 | ||||||
|                         let specific_lit = if let Ok(ty) = stream.parse::<Type>() { |                         let a = specific_float_lit(value, &mut stream)?; | ||||||
|                             Some(match ty.0 { |                         dbg!(&a); | ||||||
|                                 TypeKind::F16 => SpecificLiteral::F16(value as f32), |                         a | ||||||
|                                 TypeKind::F32B => SpecificLiteral::F32B(value as f32), |  | ||||||
|                                 TypeKind::F32 => SpecificLiteral::F32(value as f32), |  | ||||||
|                                 TypeKind::F64 => SpecificLiteral::F64(value), |  | ||||||
|                                 TypeKind::F80 => SpecificLiteral::F80(value), |  | ||||||
|                                 TypeKind::F128 => SpecificLiteral::F128(value), |  | ||||||
|                                 TypeKind::F128PPC => SpecificLiteral::F128PPC(value), |  | ||||||
|                                 _ => return Err(stream.expected_err("float-compatible type")?), |  | ||||||
|                             }) |  | ||||||
|                         } else { |  | ||||||
|                             None |  | ||||||
|                         }; |  | ||||||
|                         if let Some(lit) = specific_lit { |  | ||||||
|                             Expression( |  | ||||||
|                                 Kind::Literal(Literal::Specific(lit)), |  | ||||||
|                                 stream.get_range().unwrap(), |  | ||||||
|                             ) |  | ||||||
|                         } else { |  | ||||||
|                             Expression( |  | ||||||
|                                 Kind::Literal(Literal::Decimal(value)), |  | ||||||
|                                 stream.get_range().unwrap(), |  | ||||||
|                             ) |  | ||||||
|                         } |  | ||||||
|                     } else { |                     } else { | ||||||
|                         specific_int_lit( |                         specific_int_lit( | ||||||
|                             u128::from_str_radix(&v, 10) |                             u128::from_str_radix(&v, 10) | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user