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(
|
||||
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(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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