Fix struct-parsing interfering with if-parsing
This commit is contained in:
		
							parent
							
								
									066f441a77
								
							
						
					
					
						commit
						471c2eaf87
					
				
							
								
								
									
										7
									
								
								main.cpp
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								main.cpp
									
									
									
									
									
								
							| @ -1,7 +0,0 @@ | ||||
| #include <iostream> | ||||
| 
 | ||||
| extern "C" { | ||||
| int mainfunc(); | ||||
| } | ||||
| 
 | ||||
| int main() { std::cout << "Return value of test: " << mainfunc() << std::endl; } | ||||
| @ -120,6 +120,8 @@ impl CompiledModule { | ||||
|             let llvm_ir = from_cstring(LLVMPrintModuleToString(self.module_ref)) | ||||
|                 .expect("Unable to print LLVM IR to string"); | ||||
| 
 | ||||
|             println!("{}", llvm_ir); | ||||
| 
 | ||||
|             let mut err = ErrorMessageHolder::null(); | ||||
|             LLVMVerifyModule( | ||||
|                 self.module_ref, | ||||
| @ -127,11 +129,6 @@ impl CompiledModule { | ||||
|                 err.borrow_mut(), | ||||
|             ); | ||||
| 
 | ||||
|             if let Err(e) = err.into_result() { | ||||
|                 println!("{}", llvm_ir); | ||||
|                 panic!("{}", e); | ||||
|             } | ||||
| 
 | ||||
|             CompileOutput { | ||||
|                 triple: from_cstring(triple).expect("Unable to convert triple from cstring"), | ||||
|                 assembly: asm_buffer | ||||
| @ -829,6 +826,7 @@ impl InstructionHolder { | ||||
|                 FCmp(pred, lhs, rhs) => { | ||||
|                     let lhs = module.values.get(&lhs).unwrap(); | ||||
|                     let rhs_val = module.values.get(&rhs).unwrap().value_ref; | ||||
|                     dbg!(pred.as_llvm_unsorted_float()); | ||||
|                     LLVMBuildFCmp( | ||||
|                         module.builder_ref, | ||||
|                         pred.as_llvm_unsorted_float(), | ||||
| @ -1072,12 +1070,12 @@ impl CmpPredicate { | ||||
|         use CmpPredicate::*; | ||||
|         use LLVMRealPredicate::*; | ||||
|         match self { | ||||
|             LT => LLVMRealULT, | ||||
|             LE => LLVMRealULE, | ||||
|             GT => LLVMRealUGT, | ||||
|             GE => LLVMRealUGE, | ||||
|             EQ => LLVMRealUEQ, | ||||
|             NE => LLVMRealUNE, | ||||
|             LT => LLVMRealOLT, | ||||
|             LE => LLVMRealOLE, | ||||
|             GT => LLVMRealOGT, | ||||
|             GE => LLVMRealOGE, | ||||
|             EQ => LLVMRealOEQ, | ||||
|             NE => LLVMRealONE, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -152,6 +152,7 @@ pub enum ReturnType { | ||||
| pub struct StructExpression { | ||||
|     name: String, | ||||
|     fields: Vec<(String, Expression)>, | ||||
|     range: TokenRange, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
|  | ||||
| @ -110,13 +110,9 @@ impl Parse for PrimaryExpression { | ||||
|                 Kind::BlockExpr(Box::new(block)), | ||||
|                 stream.get_range().unwrap(), | ||||
|             ) | ||||
|         } else if let Ok(ifexpr) = stream.parse() { | ||||
|             Expression(Kind::IfExpr(Box::new(ifexpr)), stream.get_range().unwrap()) | ||||
|         } else if let (Some(Token::Identifier(_)), Some(Token::BraceOpen)) = | ||||
|             (stream.peek(), stream.peek2()) | ||||
|         { | ||||
|         } else if let Some(Token::If) = stream.peek() { | ||||
|             Expression( | ||||
|                 Kind::StructExpression(stream.parse()?), | ||||
|                 Kind::IfExpr(Box::new(stream.parse()?)), | ||||
|                 stream.get_range().unwrap(), | ||||
|             ) | ||||
|         } else if let (Some(Token::Et), Some(Token::MutKeyword)) = (stream.peek(), stream.peek2()) { | ||||
| @ -143,19 +139,19 @@ impl Parse for PrimaryExpression { | ||||
|                 Kind::UnaryOperation(unary, Box::new(stream.parse()?)), | ||||
|                 stream.get_range().unwrap(), | ||||
|             ) | ||||
|         } else if let Some(token) = stream.next() { | ||||
|         } else if let Some(token) = stream.peek() { | ||||
|             match &token { | ||||
|                 Token::Identifier(v) => { | ||||
|                     if let Some(Token::BraceOpen) = stream.peek() { | ||||
|                         Expression( | ||||
|                             Kind::StructExpression(stream.parse()?), | ||||
|                             stream.get_range().unwrap(), | ||||
|                         ) | ||||
|                     if let Ok(struct_expr) = stream.parse::<StructExpression>() { | ||||
|                         let range = struct_expr.range.clone(); | ||||
|                         Expression(Kind::StructExpression(struct_expr), range) | ||||
|                     } else { | ||||
|                         stream.next(); // Consume ident
 | ||||
|                         Expression(Kind::VariableName(v.clone()), stream.get_range().unwrap()) | ||||
|                     } | ||||
|                 } | ||||
|                 Token::DecimalValue(v) => { | ||||
|                     stream.next(); // Consume decimal
 | ||||
|                     if let Some(Token::Dot) = stream.peek() { | ||||
|                         stream.next(); // Consume dot
 | ||||
|                         let Some(Token::DecimalValue(fractional)) = stream.next() else { | ||||
| @ -174,24 +170,35 @@ impl Parse for PrimaryExpression { | ||||
|                         ) | ||||
|                     } | ||||
|                 } | ||||
|                 Token::StringLit(v) => Expression( | ||||
|                     Kind::Literal(Literal::String(v.clone())), | ||||
|                     stream.get_range().unwrap(), | ||||
|                 ), | ||||
|                 Token::True => Expression( | ||||
|                     Kind::Literal(Literal::Bool(true)), | ||||
|                     stream.get_range().unwrap(), | ||||
|                 ), | ||||
|                 Token::False => Expression( | ||||
|                     Kind::Literal(Literal::Bool(false)), | ||||
|                     stream.get_range().unwrap(), | ||||
|                 ), | ||||
|                 Token::StringLit(v) => { | ||||
|                     stream.next(); // Consume
 | ||||
|                     Expression( | ||||
|                         Kind::Literal(Literal::String(v.clone())), | ||||
|                         stream.get_range().unwrap(), | ||||
|                     ) | ||||
|                 } | ||||
|                 Token::True => { | ||||
|                     stream.next(); // Consume
 | ||||
|                     Expression( | ||||
|                         Kind::Literal(Literal::Bool(true)), | ||||
|                         stream.get_range().unwrap(), | ||||
|                     ) | ||||
|                 } | ||||
|                 Token::False => { | ||||
|                     stream.next(); // Consume
 | ||||
|                     Expression( | ||||
|                         Kind::Literal(Literal::Bool(false)), | ||||
|                         stream.get_range().unwrap(), | ||||
|                     ) | ||||
|                 } | ||||
|                 Token::ParenOpen => { | ||||
|                     stream.next(); // Consume
 | ||||
|                     let exp = stream.parse()?; | ||||
|                     stream.expect(Token::ParenClose)?; | ||||
|                     exp | ||||
|                 } | ||||
|                 Token::BracketOpen => { | ||||
|                     stream.next(); // Consume
 | ||||
|                     let mut expressions = Vec::new(); | ||||
|                     if let Ok(exp) = stream.parse() { | ||||
|                         expressions.push(exp); | ||||
| @ -521,7 +528,11 @@ impl Parse for StructExpression { | ||||
| 
 | ||||
|         stream.expect(Token::BraceClose)?; | ||||
| 
 | ||||
|         Ok(StructExpression { name, fields }) | ||||
|         Ok(StructExpression { | ||||
|             name, | ||||
|             fields, | ||||
|             range: stream.get_range().unwrap(), | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -20,6 +20,11 @@ fn main() -> u32 { | ||||
| 
 | ||||
|   *a.second[2] = 15; | ||||
| 
 | ||||
|   let b = 4; | ||||
|   if value.field < b { | ||||
|     return 0; | ||||
|   } | ||||
| 
 | ||||
| 
 | ||||
|   return value.second[2]; | ||||
| } | ||||
|  | ||||
| @ -3,3 +3,7 @@ | ||||
| pub fn OneHalf(var1: f32) -> f32 { | ||||
|   return var1 * 1.5; | ||||
| } | ||||
| 
 | ||||
| pub fn main() -> bool { | ||||
|   return 7.5 > 5.5; | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user