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))
.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,
}
}
}

View File

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

View File

@ -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(
Token::StringLit(v) => {
stream.next(); // Consume
Expression(
Kind::Literal(Literal::String(v.clone())),
stream.get_range().unwrap(),
),
Token::True => Expression(
)
}
Token::True => {
stream.next(); // Consume
Expression(
Kind::Literal(Literal::Bool(true)),
stream.get_range().unwrap(),
),
Token::False => Expression(
)
}
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(),
})
}
}

View File

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

View File

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