Start adding chars
This commit is contained in:
		
							parent
							
								
									9c0d373f9d
								
							
						
					
					
						commit
						e220900ac3
					
				| @ -44,6 +44,7 @@ pub enum Literal { | ||||
|     Decimal(f64), | ||||
|     Bool(bool), | ||||
|     String(String), | ||||
|     Char(String), | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
|  | ||||
| @ -289,6 +289,7 @@ impl ast::Literal { | ||||
|             ast::Literal::Bool(v) => mir::Literal::Bool(*v), | ||||
|             ast::Literal::String(val) => mir::Literal::String(val.clone()), | ||||
|             ast::Literal::Decimal(v) => mir::Literal::Vague(mir::VagueLiteral::Decimal(*v)), | ||||
|             ast::Literal::Char(inner) => mir::Literal::Char(inner.chars().next().unwrap()), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1199,6 +1199,7 @@ impl mir::Literal { | ||||
|             mir::Literal::F80(val) => ConstValue::F80(val), | ||||
|             mir::Literal::F128(val) => ConstValue::F128(val), | ||||
|             mir::Literal::F128PPC(val) => ConstValue::F128PPC(val), | ||||
|             mir::Literal::Char(c) => todo!(), | ||||
|         }) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| use std::{fmt::Debug, str::Chars}; | ||||
| use std::{fmt::Debug, hint::unreachable_unchecked, str::Chars}; | ||||
| 
 | ||||
| static DECIMAL_NUMERICS: &[char] = &['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; | ||||
| 
 | ||||
| @ -8,7 +8,9 @@ pub enum Token { | ||||
|     Identifier(String), | ||||
|     /// Number with at most one decimal point
 | ||||
|     DecimalValue(u64), | ||||
|     /// Some string literal that was surrounded by "quotes".
 | ||||
|     /// Some character literal that was surrounded by 'single-quotes'.
 | ||||
|     CharLit(String), | ||||
|     /// Some string literal that was surrounded by "double-quotes".
 | ||||
|     StringLit(String), | ||||
| 
 | ||||
|     // Keywords
 | ||||
| @ -112,6 +114,7 @@ impl ToString for Token { | ||||
|         match &self { | ||||
|             Token::Identifier(ident) => ident.clone(), | ||||
|             Token::DecimalValue(val) => val.to_string(), | ||||
|             Token::CharLit(lit) => format!("\'{}\'", lit), | ||||
|             Token::StringLit(lit) => format!("\"{}\"", lit), | ||||
|             Token::LetKeyword => String::from("let"), | ||||
|             Token::MutKeyword => String::from("mut"), | ||||
| @ -245,10 +248,12 @@ pub fn tokenize<T: Into<String>>(to_tokenize: T) -> Result<Vec<FullToken>, Error | ||||
|                 } | ||||
|                 continue; | ||||
|             } | ||||
|             '\"' => { | ||||
|             '\"' | '\'' => { | ||||
|                 let mut value = String::new(); | ||||
|                 let mut ignore_next = false; | ||||
|                 while cursor.first().is_some() && (cursor.first() != Some('\"') || ignore_next) { | ||||
|                 while cursor.first().is_some() | ||||
|                     && (cursor.first() != Some(*character) || ignore_next) | ||||
|                 { | ||||
|                     if cursor.first() == Some('\\') && !ignore_next { | ||||
|                         cursor.next(); // Consume backslash anjd always add next character
 | ||||
|                         ignore_next = true; | ||||
| @ -257,12 +262,16 @@ pub fn tokenize<T: Into<String>>(to_tokenize: T) -> Result<Vec<FullToken>, Error | ||||
|                         value += &cursor.next().unwrap().to_string(); | ||||
|                     } | ||||
|                 } | ||||
|                 if cursor.first() == Some('\"') { | ||||
|                 if cursor.first() == Some(*character) { | ||||
|                     cursor.next(); | ||||
|                 } else { | ||||
|                     return Err(Error::MissingQuotation(position)); | ||||
|                 } | ||||
|                 Token::StringLit(value) | ||||
|                 match character { | ||||
|                     '\'' => Token::StringLit(value), | ||||
|                     '\"' => Token::StringLit(value), | ||||
|                     _ => unsafe { unreachable_unchecked() }, | ||||
|                 } | ||||
|             } | ||||
|             // "words"
 | ||||
|             c if c.is_alphabetic() => { | ||||
|  | ||||
| @ -269,6 +269,7 @@ impl Display for Literal { | ||||
|             Literal::F80(val) => write!(f, "{}f80", val), | ||||
|             Literal::F128(val) => write!(f, "{}f128", val), | ||||
|             Literal::F128PPC(val) => write!(f, "{}f128ppc", val), | ||||
|             Literal::Char(c) => std::fmt::Debug::fmt(c, f), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,4 @@ | ||||
| use crate::util::try_all; | ||||
| 
 | ||||
| use super::{pass::ScopeFunction, typecheck::ErrorKind, typerefs::TypeRefs, VagueType as Vague, *}; | ||||
| use super::{typecheck::ErrorKind, typerefs::TypeRefs, VagueType as Vague, *}; | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
| pub enum ReturnTypeOther { | ||||
| @ -81,8 +79,12 @@ impl TypeKind { | ||||
|             let other_cat = other.category(); | ||||
|             match (self, other) { | ||||
|                 (TypeKind::UserPtr(_), TypeKind::UserPtr(_)) => Ok(other.clone()), | ||||
|                 (TypeKind::Str, TypeKind::U8) => Ok(other.clone()), | ||||
|                 (TypeKind::U8, TypeKind::Str) => Ok(other.clone()), | ||||
|                 _ => match (&self_cat, &other_cat) { | ||||
|                     (TypeCategory::Integer, TypeCategory::Integer) => Ok(other.clone()), | ||||
|                     (TypeCategory::Integer, TypeCategory::Real) => Ok(other.clone()), | ||||
|                     (TypeCategory::Real, TypeCategory::Integer) => Ok(other.clone()), | ||||
|                     (TypeCategory::Real, TypeCategory::Real) => Ok(other.clone()), | ||||
|                     _ => Err(ErrorKind::NotCastableTo(self.clone(), other.clone())), | ||||
|                 }, | ||||
| @ -610,6 +612,7 @@ impl Literal { | ||||
|             Literal::F80(_) => None, | ||||
|             Literal::F128(_) => None, | ||||
|             Literal::F128PPC(_) => None, | ||||
|             Literal::Char(_) => None, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -162,6 +162,7 @@ pub enum Literal { | ||||
|     F128PPC(f64), | ||||
|     Bool(bool), | ||||
|     String(String), | ||||
|     Char(char), | ||||
|     Vague(VagueLiteral), | ||||
| } | ||||
| 
 | ||||
| @ -195,6 +196,7 @@ impl Literal { | ||||
|             Literal::F80(_) => TypeKind::F80, | ||||
|             Literal::F128(_) => TypeKind::F128, | ||||
|             Literal::F128PPC(_) => TypeKind::F128PPC, | ||||
|             Literal::Char(_) => todo!(), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,6 +1,7 @@ | ||||
| // Arithmetic, function calls and imports! | ||||
| 
 | ||||
| import std::allocate; | ||||
| import std::print; | ||||
| 
 | ||||
| fn other() -> i16 { | ||||
|   return 6; | ||||
| @ -8,6 +9,8 @@ fn other() -> i16 { | ||||
| 
 | ||||
| fn main() -> u32 { | ||||
|   let value = other() as u32; | ||||
|   let other_value = other() as f32; | ||||
|   let same_value = other() as i16; | ||||
| 
 | ||||
|   let v = (allocate(4) as *u32); | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										5
									
								
								reid_src/char.reid
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								reid_src/char.reid
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| // Arithmetic, function calls and imports! | ||||
| 
 | ||||
| pub fn main() -> char { | ||||
|   return 'b'; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user