From 9fd09eff375777cededa8e1d230efe3ae1c5d3d8 Mon Sep 17 00:00:00 2001 From: mark Date: Tue, 23 May 2023 20:49:39 +0200 Subject: [PATCH] fixed order of operations --- mers/c.mers | 6 - mers/src/lang/val_type.rs | 2 +- mers/src/parsing/parse.rs | 255 +++++++++++++++++++------------------- mers/t.mers | 11 -- 4 files changed, 129 insertions(+), 145 deletions(-) delete mode 100644 mers/c.mers delete mode 100644 mers/t.mers diff --git a/mers/c.mers b/mers/c.mers deleted file mode 100644 index b544b26..0000000 --- a/mers/c.mers +++ /dev/null @@ -1,6 +0,0 @@ -list = [1 ...] -b = list -&list.pop() -// &list.push(5) -println(b.to_string()) -list \ No newline at end of file diff --git a/mers/src/lang/val_type.rs b/mers/src/lang/val_type.rs index ef5326e..9dbc7c5 100755 --- a/mers/src/lang/val_type.rs +++ b/mers/src/lang/val_type.rs @@ -425,7 +425,7 @@ impl VSingleType { } }) || info.custom_types[*t].fits_in(rhs, info).is_empty() } - _ => rhs.types.iter().any(|t| self.fits_in(t, info)), + _ => rhs.types.iter().any(|b| self.fits_in(b, info)), } } } diff --git a/mers/src/parsing/parse.rs b/mers/src/parsing/parse.rs index 246f677..32c5ff1 100755 --- a/mers/src/parsing/parse.rs +++ b/mers/src/parsing/parse.rs @@ -844,16 +844,134 @@ pub mod implementation { // special characters that can follow a statement (loop because these can be chained) loop { file.skip_whitespaces(); - // most local (a.b) - // 010 . - // 020 + - - // 025 * / % - // 050 == != > < >= <= - // 200 = - // least local (a == b) | -> a.b == c + 2 works as expected + // least local (evaluated last) + // 0 = + // 020 == != + // 025 > < >= <= + // 050 + - + // 055 * / % + // 080 . + // most local (evaluated first) out = match (chain_level, file.peek()) { - // 010 . - (0..=10, Some('.')) + // 000 = + (0..=0, Some('=')) => { + file.next(); + match out.statement.as_mut() { + SStatementEnum::Variable(name, r) => { + if name.starts_with("*") { + *name = name[1..].to_owned(); + } else { + *r = true + } + } + _ => {} + } + // NOTE: Set this 0 to 1 to prevent a = b = c from being valid + parse_statement(file)?.output_to(out, 0) + } + // 020 == != + (0..=20, Some('=')) + if matches!( + file.get_char(file.get_pos().current_char_index + 1), + Some('=') + ) => + { + file.next(); + file.next(); + SStatementEnum::FunctionCall( + "eq".to_owned(), + vec![out, parse_statement_adv(file, false, 21)?], + ) + .to() + } + (0..=20, Some('!')) + if matches!( + file.get_char(file.get_pos().current_char_index + 1), + Some('=') + ) => + { + file.next(); + file.next(); + SStatementEnum::FunctionCall( + "ne".to_owned(), + vec![out, parse_statement_adv(file, false, 21)?], + ) + .to() + } + // 025 > >= < <= + (0..=25, Some('>')) => { + file.next(); + SStatementEnum::FunctionCall( + if let Some('=') = file.peek() { + file.next(); + "gtoe".to_owned() + } else { + "gt".to_owned() + }, + vec![out, parse_statement_adv(file, false, 26)?], + ) + .to() + } + (0..=25, Some('<')) => { + file.next(); + SStatementEnum::FunctionCall( + if let Some('=') = file.peek() { + file.next(); + "ltoe".to_owned() + } else { + "lt".to_owned() + }, + vec![out, parse_statement_adv(file, false, 26)?], + ) + .to() + } + // 050 + - + (0..=50, Some('+')) => { + file.next(); + SStatementEnum::FunctionCall( + "add".to_owned(), + // AMONG + vec![out, parse_statement_adv(file, false, 51)?], + ) + .to() + } + (0..=50, Some('-')) => { + file.next(); + SStatementEnum::FunctionCall( + "sub".to_owned(), + // US + vec![out, parse_statement_adv(file, false, 51)?], + ) + .to() + } + // 055 * / % + (0..=55, Some('*')) => { + file.next(); + SStatementEnum::FunctionCall( + "mul".to_owned(), + vec![out, parse_statement_adv(file, false, 56)?], + ) + .to() + } + (0..=55, Some('/')) => { + file.next(); + SStatementEnum::FunctionCall( + "div".to_owned(), + // RED SUSSY MOGUS MAN + vec![out, parse_statement_adv(file, false, 56)?], + ) + .to() + } + (0..=55, Some('%')) => { + file.next(); + SStatementEnum::FunctionCall( + "mod".to_owned(), + vec![out, parse_statement_adv(file, false, 56)?], + ) + .to() + } + // 080 . + (0..=80, Some('.')) if !matches!( file.get_char(file.get_pos().current_char_index + 1), Some('.') @@ -861,7 +979,7 @@ pub mod implementation { { file.next(); let err_start_of_wrapper = *file.get_pos(); - let wrapper = parse_statement_adv(file, true, 11)?; + let wrapper = parse_statement_adv(file, true, 81)?; let err_end_of_wrapper = *file.get_pos(); match *wrapper.statement { SStatementEnum::FunctionCall(func, args) => { @@ -903,123 +1021,6 @@ pub mod implementation { } } } - // 20 + - - (0..=20, Some('+')) => { - file.next(); - SStatementEnum::FunctionCall( - "add".to_owned(), - // AMONG - vec![out, parse_statement_adv(file, false, 21)?], - ) - .to() - } - (0..=20, Some('-')) => { - file.next(); - SStatementEnum::FunctionCall( - "sub".to_owned(), - // US - vec![out, parse_statement_adv(file, false, 21)?], - ) - .to() - } - // 025 * / % - (0..=25, Some('*')) => { - file.next(); - SStatementEnum::FunctionCall( - "mul".to_owned(), - vec![out, parse_statement_adv(file, false, 26)?], - ) - .to() - } - (0..=25, Some('/')) => { - file.next(); - SStatementEnum::FunctionCall( - "div".to_owned(), - // RED SUSSY MOGUS MAN - vec![out, parse_statement_adv(file, false, 26)?], - ) - .to() - } - (0..=25, Some('%')) => { - file.next(); - SStatementEnum::FunctionCall( - "mod".to_owned(), - vec![out, parse_statement_adv(file, false, 26)?], - ) - .to() - } - // 045 > >= < <= - (0..=45, Some('>')) => { - file.next(); - SStatementEnum::FunctionCall( - if let Some('=') = file.peek() { - file.next(); - "gtoe".to_owned() - } else { - "gt".to_owned() - }, - vec![out, parse_statement_adv(file, false, 46)?], - ) - .to() - } - (0..=45, Some('<')) => { - file.next(); - SStatementEnum::FunctionCall( - if let Some('=') = file.peek() { - file.next(); - "ltoe".to_owned() - } else { - "lt".to_owned() - }, - vec![out, parse_statement_adv(file, false, 46)?], - ) - .to() - } - // 050 == != - (0..=50, Some('=')) - if matches!( - file.get_char(file.get_pos().current_char_index + 1), - Some('=') - ) => - { - file.next(); - file.next(); - SStatementEnum::FunctionCall( - "eq".to_owned(), - vec![out, parse_statement_adv(file, false, 51)?], - ) - .to() - } - (0..=50, Some('!')) - if matches!( - file.get_char(file.get_pos().current_char_index + 1), - Some('=') - ) => - { - file.next(); - file.next(); - SStatementEnum::FunctionCall( - "ne".to_owned(), - vec![out, parse_statement_adv(file, false, 51)?], - ) - .to() - } - // 200 = - (0..=200, Some('=')) => { - file.next(); - match out.statement.as_mut() { - SStatementEnum::Variable(name, r) => { - if name.starts_with("*") { - *name = name[1..].to_owned(); - } else { - *r = true - } - } - _ => {} - } - // NOTE: Set this 0 to 201 to prevent a = b = c from being valid - parse_statement(file)?.output_to(out, 0) - } _ => break, }; } diff --git a/mers/t.mers b/mers/t.mers deleted file mode 100644 index 70aa192..0000000 --- a/mers/t.mers +++ /dev/null @@ -1,11 +0,0 @@ -a = (max int) { - println("Max: " + max.to_string()) - for i max { - println(i.to_string()) - } -} -a.debug() -// why does this work -a.thread(10).await() -// and this just blocks and does nothing -a.run(10)