mirror of
https://github.com/open-thought/reasoning-gym.git
synced 2026-04-19 12:58:07 +00:00
129 lines
3.9 KiB
Python
129 lines
3.9 KiB
Python
from .Functions import insert_function_object
|
|
from .Token import Token
|
|
|
|
|
|
class LibraryFunctionCompiler:
|
|
def __init__(self, name, type, parameters, code):
|
|
self.name = name
|
|
self.type = type
|
|
self.parameters = parameters
|
|
self.code = code
|
|
|
|
def get_code(self, current_stack_pointer):
|
|
return self.code
|
|
|
|
|
|
def get_readint_code():
|
|
# res, tmp, input, loop
|
|
# tmp is used for multiplication
|
|
"""
|
|
res = 0
|
|
loop = 1
|
|
|
|
while loop
|
|
loop = 0
|
|
input = input()
|
|
if input != newline # todo add a eof check as well. run it in several interpreters to look for common ways for "end of number" input
|
|
loop = 1
|
|
res *= 10 + char_to_digit(input)
|
|
"""
|
|
|
|
code = "[-]" # clear res = 0
|
|
code += ">[-]" # tmp = 0
|
|
code += ">>[-]+" # loop = 1
|
|
|
|
code += "[" # while loop == 1
|
|
code += "[-]" # loop = 0
|
|
code += "<" # point to input
|
|
code += "," # input character
|
|
code += "----------" # sub 10 (check for newline)
|
|
|
|
code += "[" # if input is not newline
|
|
code += ">" # point to loop
|
|
code += "+" # loop = 1
|
|
|
|
# multiply res by 10 and add the input digit
|
|
code += "<<<" # point to res
|
|
code += "[>+<-]" # move res to tmp
|
|
code += ">" # point to tmp
|
|
code += "[<++++++++++>-]" # res = tmp * 10, tmp = 0
|
|
code += ">" # point to input
|
|
code += "-" * (
|
|
0x30 - 10
|
|
) # convert character to a digit by subtracting 0x30 from it (we already subtracted 10 before)
|
|
code += "[<<+>>-]" # res += input
|
|
code += "]" # end if
|
|
|
|
code += ">" # point to loop
|
|
code += "]" # end while
|
|
|
|
code += "<<<" # point to res
|
|
|
|
return code
|
|
|
|
|
|
def get_printint_code():
|
|
# return_cell value_to_print_cell
|
|
|
|
code = ">" # point to value_to_print cell
|
|
code += ">[-]" * 8 + "<" * 8 # zero some cells
|
|
|
|
code += ">++++++++++<" # div amount
|
|
code += "[->-[>+>>]>[+[<+>-]>+>>]<<<<<]" # value_to_print/10
|
|
code += ">[-]" # zero d-n%d
|
|
code += ">>" # point to div result
|
|
|
|
code += ">++++++++++<" # div amount
|
|
code += "[->-[>+>>]>[+[<+>-]>+>>]<<<<<]" # res/10
|
|
code += ">[-]" # zero d-n%d
|
|
code += ">>" # point to div result
|
|
|
|
code += "[" # if the first digit is not 0
|
|
code += ">++++++[<++++++++>-]<." # add 48 to the first digit and print it
|
|
code += "<<"
|
|
code += "+>" # set is_over_100 to true
|
|
code += "+>" # add 1 to the second digit so it prints even when it's 0
|
|
code += "[-]" # zero the first digit
|
|
code += "]" # end if
|
|
|
|
code += "<" # point to the second digit
|
|
|
|
code += "[" # if the second digit is not 0
|
|
code += "<[>-<-]" # if is_over_100 is true then subtract 1 from the second digit
|
|
code += "++++++[>++++++++<-]>." # add 48 to the second digit and print it
|
|
code += "[-]" # zero the second digit
|
|
code += "]" # end if
|
|
|
|
code += "<<" # point to the cell after the third digit
|
|
code += "++++++[<++++++++>-]<." # add 48 to the third digit and print it
|
|
code += "[-]" # zero the third digit
|
|
code += "<<" # point to value_to_print_cell which is 0
|
|
|
|
code += "<" # point to return_cell
|
|
return code
|
|
|
|
|
|
def get_readchar_code():
|
|
# read input into "return value cell". no need to move the pointer
|
|
code = ","
|
|
return code
|
|
|
|
|
|
def get_printchar_code():
|
|
# point to parameter, output it, and then point back to "return value cell"
|
|
code = ">.<"
|
|
return code
|
|
|
|
|
|
def insert_library_functions():
|
|
readint = LibraryFunctionCompiler("readint", Token.INT, list(), get_readint_code())
|
|
insert_function_object(readint)
|
|
|
|
printint = LibraryFunctionCompiler("printint", Token.VOID, [Token.INT], get_printint_code())
|
|
insert_function_object(printint)
|
|
|
|
readchar = LibraryFunctionCompiler("readchar", Token.INT, list(), get_readchar_code())
|
|
insert_function_object(readchar)
|
|
|
|
printchar = LibraryFunctionCompiler("printchar", Token.VOID, [Token.INT], get_printchar_code())
|
|
insert_function_object(printchar)
|