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))
|
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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)]
|
||||||
|
@ -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) => {
|
||||||
|
stream.next(); // Consume
|
||||||
|
Expression(
|
||||||
Kind::Literal(Literal::String(v.clone())),
|
Kind::Literal(Literal::String(v.clone())),
|
||||||
stream.get_range().unwrap(),
|
stream.get_range().unwrap(),
|
||||||
),
|
)
|
||||||
Token::True => Expression(
|
}
|
||||||
|
Token::True => {
|
||||||
|
stream.next(); // Consume
|
||||||
|
Expression(
|
||||||
Kind::Literal(Literal::Bool(true)),
|
Kind::Literal(Literal::Bool(true)),
|
||||||
stream.get_range().unwrap(),
|
stream.get_range().unwrap(),
|
||||||
),
|
)
|
||||||
Token::False => Expression(
|
}
|
||||||
|
Token::False => {
|
||||||
|
stream.next(); // Consume
|
||||||
|
Expression(
|
||||||
Kind::Literal(Literal::Bool(false)),
|
Kind::Literal(Literal::Bool(false)),
|
||||||
stream.get_range().unwrap(),
|
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(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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];
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user