Fix struct-parsing interfering with if-parsing

This commit is contained in:
Sofia 2025-07-21 20:52:39 +03:00
parent 066f441a77
commit 471c2eaf87
6 changed files with 55 additions and 43 deletions

View File

@ -1,7 +0,0 @@
#include <iostream>
extern "C" {
int mainfunc();
}
int main() { std::cout << "Return value of test: " << mainfunc() << std::endl; }

View File

@ -120,6 +120,8 @@ impl CompiledModule {
let llvm_ir = from_cstring(LLVMPrintModuleToString(self.module_ref)) let llvm_ir = from_cstring(LLVMPrintModuleToString(self.module_ref))
.expect("Unable to print LLVM IR to string"); .expect("Unable to print LLVM IR to string");
println!("{}", llvm_ir);
let mut err = ErrorMessageHolder::null(); let mut err = ErrorMessageHolder::null();
LLVMVerifyModule( LLVMVerifyModule(
self.module_ref, self.module_ref,
@ -127,11 +129,6 @@ impl CompiledModule {
err.borrow_mut(), err.borrow_mut(),
); );
if let Err(e) = err.into_result() {
println!("{}", llvm_ir);
panic!("{}", e);
}
CompileOutput { CompileOutput {
triple: from_cstring(triple).expect("Unable to convert triple from cstring"), triple: from_cstring(triple).expect("Unable to convert triple from cstring"),
assembly: asm_buffer assembly: asm_buffer
@ -829,6 +826,7 @@ impl InstructionHolder {
FCmp(pred, lhs, rhs) => { FCmp(pred, lhs, rhs) => {
let lhs = module.values.get(&lhs).unwrap(); let lhs = module.values.get(&lhs).unwrap();
let rhs_val = module.values.get(&rhs).unwrap().value_ref; let rhs_val = module.values.get(&rhs).unwrap().value_ref;
dbg!(pred.as_llvm_unsorted_float());
LLVMBuildFCmp( LLVMBuildFCmp(
module.builder_ref, module.builder_ref,
pred.as_llvm_unsorted_float(), pred.as_llvm_unsorted_float(),
@ -1072,12 +1070,12 @@ impl CmpPredicate {
use CmpPredicate::*; use CmpPredicate::*;
use LLVMRealPredicate::*; use LLVMRealPredicate::*;
match self { match self {
LT => LLVMRealULT, LT => LLVMRealOLT,
LE => LLVMRealULE, LE => LLVMRealOLE,
GT => LLVMRealUGT, GT => LLVMRealOGT,
GE => LLVMRealUGE, GE => LLVMRealOGE,
EQ => LLVMRealUEQ, EQ => LLVMRealOEQ,
NE => LLVMRealUNE, NE => LLVMRealONE,
} }
} }
} }

View File

@ -152,6 +152,7 @@ pub enum ReturnType {
pub struct StructExpression { pub struct StructExpression {
name: String, name: String,
fields: Vec<(String, Expression)>, fields: Vec<(String, Expression)>,
range: TokenRange,
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]

View File

@ -110,13 +110,9 @@ impl Parse for PrimaryExpression {
Kind::BlockExpr(Box::new(block)), Kind::BlockExpr(Box::new(block)),
stream.get_range().unwrap(), stream.get_range().unwrap(),
) )
} else if let Ok(ifexpr) = stream.parse() { } else if let Some(Token::If) = stream.peek() {
Expression(Kind::IfExpr(Box::new(ifexpr)), stream.get_range().unwrap())
} else if let (Some(Token::Identifier(_)), Some(Token::BraceOpen)) =
(stream.peek(), stream.peek2())
{
Expression( Expression(
Kind::StructExpression(stream.parse()?), Kind::IfExpr(Box::new(stream.parse()?)),
stream.get_range().unwrap(), stream.get_range().unwrap(),
) )
} else if let (Some(Token::Et), Some(Token::MutKeyword)) = (stream.peek(), stream.peek2()) { } 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()?)), Kind::UnaryOperation(unary, Box::new(stream.parse()?)),
stream.get_range().unwrap(), stream.get_range().unwrap(),
) )
} else if let Some(token) = stream.next() { } else if let Some(token) = stream.peek() {
match &token { match &token {
Token::Identifier(v) => { Token::Identifier(v) => {
if let Some(Token::BraceOpen) = stream.peek() { if let Ok(struct_expr) = stream.parse::<StructExpression>() {
Expression( let range = struct_expr.range.clone();
Kind::StructExpression(stream.parse()?), Expression(Kind::StructExpression(struct_expr), range)
stream.get_range().unwrap(),
)
} else { } else {
stream.next(); // Consume ident
Expression(Kind::VariableName(v.clone()), stream.get_range().unwrap()) Expression(Kind::VariableName(v.clone()), stream.get_range().unwrap())
} }
} }
Token::DecimalValue(v) => { Token::DecimalValue(v) => {
stream.next(); // Consume decimal
if let Some(Token::Dot) = stream.peek() { if let Some(Token::Dot) = stream.peek() {
stream.next(); // Consume dot stream.next(); // Consume dot
let Some(Token::DecimalValue(fractional)) = stream.next() else { let Some(Token::DecimalValue(fractional)) = stream.next() else {
@ -174,24 +170,35 @@ impl Parse for PrimaryExpression {
) )
} }
} }
Token::StringLit(v) => Expression( Token::StringLit(v) => {
Kind::Literal(Literal::String(v.clone())), stream.next(); // Consume
stream.get_range().unwrap(), Expression(
), Kind::Literal(Literal::String(v.clone())),
Token::True => Expression( stream.get_range().unwrap(),
Kind::Literal(Literal::Bool(true)), )
stream.get_range().unwrap(), }
), Token::True => {
Token::False => Expression( stream.next(); // Consume
Kind::Literal(Literal::Bool(false)), Expression(
stream.get_range().unwrap(), 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 => { Token::ParenOpen => {
stream.next(); // Consume
let exp = stream.parse()?; let exp = stream.parse()?;
stream.expect(Token::ParenClose)?; stream.expect(Token::ParenClose)?;
exp exp
} }
Token::BracketOpen => { Token::BracketOpen => {
stream.next(); // Consume
let mut expressions = Vec::new(); let mut expressions = Vec::new();
if let Ok(exp) = stream.parse() { if let Ok(exp) = stream.parse() {
expressions.push(exp); expressions.push(exp);
@ -521,7 +528,11 @@ impl Parse for StructExpression {
stream.expect(Token::BraceClose)?; stream.expect(Token::BraceClose)?;
Ok(StructExpression { name, fields }) Ok(StructExpression {
name,
fields,
range: stream.get_range().unwrap(),
})
} }
} }

View File

@ -20,6 +20,11 @@ fn main() -> u32 {
*a.second[2] = 15; *a.second[2] = 15;
let b = 4;
if value.field < b {
return 0;
}
return value.second[2]; return value.second[2];
} }

View File

@ -3,3 +3,7 @@
pub fn OneHalf(var1: f32) -> f32 { pub fn OneHalf(var1: f32) -> f32 {
return var1 * 1.5; return var1 * 1.5;
} }
pub fn main() -> bool {
return 7.5 > 5.5;
}