From 3ccf7f845ffeb1c7c58c16ab10d607a81274b941 Mon Sep 17 00:00:00 2001 From: DiamondNether90 Date: Fri, 10 Oct 2025 08:28:12 +1100 Subject: [PATCH] Non-functional integer type, if function --- docs/syntax.md | 2 + src/main.py | 149 +++++++++++++++++++++++++++++++++++++++++++--- test.bf | 1 + tests/create.basm | 5 ++ tests/main.basm | 8 --- tests/main.bf | 0 6 files changed, 148 insertions(+), 17 deletions(-) create mode 100644 test.bf create mode 100644 tests/create.basm delete mode 100644 tests/main.basm delete mode 100644 tests/main.bf diff --git a/docs/syntax.md b/docs/syntax.md index 8f0d2e6..fe80176 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -1,3 +1,5 @@ +To create a comment, begin a line with a hash (#) symbol, like python. + ## create var *bytes = Value Creates the variable "var" with a set number of bytes allocated to it, and initialises its value. diff --git a/src/main.py b/src/main.py index 85d65dd..ae1542f 100644 --- a/src/main.py +++ b/src/main.py @@ -1,9 +1,12 @@ +from signal import Sigmasks import string +import math as m from sys import argv file = open(argv[1]).readlines(); bfcode = "" variables = [] varbytes = [] + def removeChar(str, char): ans = "" for i in str: @@ -23,8 +26,27 @@ def ord2(char): elif (len(char == 0)): return(0) +def sign(num): + if num < 0: + return -1 + elif num == 0: + return 0 + else: + return 1 + +def filewrite(): + with open(argv[2], "w") as file: + file.write(bfcode) + +filewrite() for i in file: - if (i.split(" ")[0] == "create"): + while (i[0] == " "): + i = i.split(" ", 1)[1] + if (i[0] == "#"): + # Skip line if it is a comment + pass + # Create command + elif (i.split(" ")[0] == "create"): if (i[len(i)-1] == "\n"): i = removeEnd(i, 1) bfcode += ">>>>>>>>>>>>[[>>]>>]" @@ -36,11 +58,15 @@ for i in file: if (a[0] == " "): a = a.split(" ", 1)[1] - # Get type - if ((a[0] == "\"") & (a[len(a)-1] == "\"")): - type = "string" - else: - type = "undefined" + # Get type + try: + a = int(a) + type = "int" + except ValueError: + if ((a[0] == "\"") & (a[len(a)-1] == "\"")): + type = "string" + elif (a == "true") | (a == "false"): + type = "bool" if (type == "string"): a = a.split("\"", 1)[1] @@ -51,8 +77,31 @@ for i in file: bfcode += "+" * ord(a[j]) + ">" else: bfcode += ">" - bfcode += "<<[[<<]<<]<<<<<<<<" + elif (type == "int"): + tempint = [sign(a)] + a = abs(a) + tempbytes = m.floor(m.log2(a)/8) + a = a % (256 ** (bytes - 1)) + for j in range(bytes - 1): + if (a == 0): + modulus = 1 + else: + modulus = 256 ** (bytes - j - 2) + tempint.append(m.floor(a / modulus)) + a -= modulus * m.floor(a/modulus) + for j in tempint: + bfcode += "++>" + bfcode += "+" * j + ">" + elif type == "bool": + if (bytes == 1): + bfcode += "++++>" + "+" * (a == "true") + ">" + else: + raise MemoryError("Booleans can only be made as 1 byte data.") + else: + raise TypeError("Could not find argument type") + bfcode += "<<[[<<]<<]<<<<<<<<" + variables.append(i.split(" ")[1].split("*")[0]) elif (i.split(" ")[0] == "print"): @@ -63,9 +112,49 @@ for i in file: bfcode += ">>>>>>>>>>>>" for j in range(variables.index(a)): bfcode += "[>>]>>" + bfcode += "[>.>]<<[[<<]<<]<<<<<<<<++++++++++.[-]" else: raise NameError(f"Could not find variable {a}") + + elif (i.split(" ")[0] == "printnum"): + varnum = variables.index(i.split(" ", 1)[1]) + bfcode += ">>>>>>>>>>>>" + for j in range(varnum): + bfcode += "[>>]>>" + for j in range(varbytes[varnum]): + # Go to correct cell + bfcode += ">>" * j + ">" + # Create Copy + bfcode += "[" + "<<" * (j+1) + "+<+>" + ">>" * (j+1) + "-]" + bfcode += "<<" * j + "<" + bfcode += "<<[" + ">>" * (j+1) + ">+" + "<<" * (j+1) + "<-]>" + + # Move copy to end + bfcode += "[->" + for k in range(len(variables)-varnum+j): + bfcode += "[>>]>>" + bfcode += "+<<<<" + + for k in range(len(variables)-varnum+j): + bfcode += "[<<]<<" + bfcode += ">>>]>" + + for k in range(len(variables)-varnum+j): + bfcode += "[>>]>>" + + # Split up digits (modulo copied from https://esolangs.org/wiki/Brainfuck_algorithms#Modulo) + bfcode += ">>++++++++++<<" + bfcode += "[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]" # MODULO + bfcode += "++>[-]>[-]>[<<+>>-]>>>++++++++++<<" + bfcode += "[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]" # MODULO + bfcode += "++<<++>>>[-]>[-]>[<<<<+>>>>-]>[<<<+>>>-]" + + # Return to start + bfcode += "<<<<" + bfcode += "[<<]<<" * (j+1) + bfcode += "[<]>" + elif (i.split(" ")[0] == "set"): a = i.split(" ")[1] @@ -95,12 +184,54 @@ for i in file: bfcode += ">" else: bfcode += "+" * ord(val[j]) + ">" + elif (type == "int"): + bytes = varbytes[variables.index(a)] + a = int(val) + tempint = [sign(a)] + a = abs(a) + tempbytes = m.floor(m.log2(a)/8) + a = a % (256 ** (bytes - 1)) + for j in range(bytes - 1): + if (a == 0): + modulus = 1 + else: + modulus = 256 ** (bytes - j - 2) + tempint.append(m.floor(a / modulus)) + a -= modulus * m.floor(a/modulus) + for j in tempint: + bfcode += "++>" + bfcode += "+" * j + ">" bfcode += "<<[[<<]<<]<<<<<<<<" else: raise NameError(f"Could not find variable {a}") + elif (i.split(" ")[0] == "if"): + # Argument must be boolean + if not ('{' in i): + raise SyntaxError(f"Expected {{ in if statement") + a = removeChar(i.split(" ", 1)[1].split("{")[0], " ") + if (a in variables): + bfcode += ">>>>>>>>>>>>" + bfcode += "[>>]>>" * (variables.index(a)) + + bfcode += ">[>+>+<<-]>[<+>-]>[-<<<" + bfcode += "[[<<]<<]" + bfcode += "+>>>>" + bfcode += "[>>]>>" * (variables.index(a)) + bfcode += ">>>]" + + bfcode += "<<<<<<<[<<<<<<<<+>>>>>>>>-]<<<<<<<<" + + bfcode += "[-" + else: + raise NameError(f"Could not find variable {a}") + + elif (i == "}"): + bfcode += "]" + + # No command elif ((i != "\n") & (i != "")): raise ValueError(f"Invalid Command") -with open(argv[2], "w") as file: - file.write(bfcode) \ No newline at end of file +print("DONE!") +filewrite() \ No newline at end of file diff --git a/test.bf b/test.bf new file mode 100644 index 0000000..cf30445 --- /dev/null +++ b/test.bf @@ -0,0 +1 @@ +>>>>>>>>>>>>[[>>]>>]++++>+><<[[<<]<<]<<<<<<<<>>>>>>>>>>>>[[>>]>>]+++>+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++><<[[<<]<<]<<<<<<<<>>>>>>>>>>>>>[>+>+<<-]>[<+>-]>[-<<<[[<<]<<]+>>>>>>>]<<<<<<<[<<<<<<<<+>>>>>>>>-]<<<<<<<<[->>>>>>>>>>>>[>>]>>[-]>[-]><<+++>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++><<[[<<]<<]<<<<<<<<] \ No newline at end of file diff --git a/tests/create.basm b/tests/create.basm new file mode 100644 index 0000000..09844b0 --- /dev/null +++ b/tests/create.basm @@ -0,0 +1,5 @@ +create bool *1 = true +create string *1 = "A" +if bool { + set string = "B" +} \ No newline at end of file diff --git a/tests/main.basm b/tests/main.basm deleted file mode 100644 index 7449802..0000000 --- a/tests/main.basm +++ /dev/null @@ -1,8 +0,0 @@ -create str1 *5 = "Hello" -create str2 *10 = "Hello!" - -print str1 -print str2 - -set str1 = "World!" -print str1 \ No newline at end of file diff --git a/tests/main.bf b/tests/main.bf deleted file mode 100644 index e69de29..0000000