mirror of
https://github.com/open-thought/reasoning-gym.git
synced 2026-04-19 12:58:07 +00:00
add contrib
This commit is contained in:
parent
99bf648989
commit
574df8de23
20 changed files with 3971 additions and 0 deletions
|
|
@ -0,0 +1,127 @@
|
|||
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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue