From e853195cc375501f38387feea8b4d0940fe2e5e0 Mon Sep 17 00:00:00 2001 From: DiamondNether90 Date: Mon, 3 Nov 2025 13:50:32 +1100 Subject: [PATCH] Equal command --- src/codegen.py | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ syntax.md | 2 ++ tests/test.basm | 14 +++++--- 3 files changed, 98 insertions(+), 4 deletions(-) diff --git a/src/codegen.py b/src/codegen.py index 0788b93..8ec5204 100644 --- a/src/codegen.py +++ b/src/codegen.py @@ -244,6 +244,92 @@ def generateCode(line: list[str], offset: int) -> str: returnval += '<[<]' + '<' * (offset-1) return returnval + elif keyword == 'equal': + if len(line) != 4: + error(f'Equal command requires 3 arguments (got {len(line)-1})') + returnval = '>' * offset + '[>]' + idx = getIndex(line[1]) + for var in variables[:idx]: + if var.bytes >= 0: + returnval += '>' * (var.bytes+1) + elif var.bytes == -1: + returnval += '>[>]' + else: + error() + returnval += '>' + for i in range(4): + returnval += '[-' + returnval += '>' * (4-i) + for var in variables[(idx+1):]: + if var.bytes >= 0: + returnval += '>' * (var.bytes+1) + elif var.bytes == -1: + returnval += '>[>]' + else: + error() + returnval += '>' * (i+1) + '+' + '<' * (i+1) + for var in reversed(variables[(idx+1):]): + if var.bytes >= 0: + returnval += '<' * (var.bytes+1) + elif var.bytes == -1: + returnval += '<[<]' + else: + error() + returnval += '<<<<<+' + '>' * (i+1) + ']' + returnval += '<' * (i+1) + '[' + '>' * (i+1) + '+' + '<' * (i+1) + '-]' + '>' * (i+2) + + # Copy the above, but subtract from duplicate + idx2 = getIndex(line[2]) + for var in variables[(idx+1):idx2]: + if var.bytes >= 0: + returnval += '>' * (var.bytes+1) + elif var.bytes == -1: + returnval += '>[>]' + else: + error() + + returnval += '>' + for i in range(4): + returnval += '[-' + returnval += '>' * (4-i) + for var in variables[(idx2+1):]: + if var.bytes >= 0: + returnval += '>' * (var.bytes+1) + elif var.bytes == -1: + returnval += '>[>]' + else: + error() + returnval += '>' * (i+1) + '-' + '<' * (i+1) + for var in reversed(variables[(idx2+1):]): + if var.bytes >= 0: + returnval += '<' * (var.bytes+1) + elif var.bytes == -1: + returnval += '<[<]' + else: + error() + returnval += '<<<<<+' + '>' * (i+1) + ']' + returnval += '<' * (i+1) + '[' + '>' * (i+1) + '+' + '<' * (i+1) + '-]' + '>' * (i+2) + + for var in variables[(idx2+1):]: + if var.bytes >= 0: + returnval += '>' * (var.bytes+1) + elif var.bytes == -1: + returnval += '>[>]' + else: + error() + + returnval += '>[<+>[-]]>[<<+>>[-]]>[<<<+>>>[-]]>[<<<<+>>>>[-]]<<<+<[>-<[-]]' + for var in reversed(variables): + if var.bytes >= 0: + returnval += '<' * (var.bytes+1) + elif var.bytes == -1: + returnval += '<[<]' + else: + error() + + returnval += '<[<]' + '<' * (offset-1) + variables.append(Variable(line[3], 1, 0)) + return returnval elif keyword == 'if': if len(line) != 2: error(f'If command requires 1 argument (got {len(line)-1})') diff --git a/syntax.md b/syntax.md index 1b4af1f..86c1f27 100644 --- a/syntax.md +++ b/syntax.md @@ -14,6 +14,8 @@ Print a string: `print name` Increment an int: `inc name` +Check if two numbers are equal, and store the result in `cond`: `equal num1 num2 cond` + If statement: ```py if bool diff --git a/tests/test.basm b/tests/test.basm index cc659e8..20cebd6 100644 --- a/tests/test.basm +++ b/tests/test.basm @@ -1,7 +1,13 @@ +int num1 796 string str1 -1 "Hello, world!" -int num 100 -bool cond true - +int num2 795 +string str2 -1 "World, hello?" +equal num1 num2 cond if cond - inc num + print str1 +end if +inc num2 +equal num1 num2 cond2 +if cond2 + print str2 end if \ No newline at end of file