DEV Community

5elenay
5elenay

Posted on

Python Brainf*ck Compiler (Alpha)

I was bored so i made a python compiler for brainf*ck programming language.

Links

Source Code (Github)
What is Brainf*ck?

Example Brainf*ck Program

[ This program prints "Hello World!" and a newline to the screen, its
  length is 106 active command characters. [It is not the shortest.]

  This loop is an "initial comment loop", a simple way of adding a comment
  to a BF program such that you don't have to worry about any command
  characters. Any ".", ",", "+", "-", "<" and ">" characters are simply
  ignored, the "[" and "]" characters just have to be balanced. This
  loop and the commands it contains are ignored because the current cell
  defaults to a value of 0; the 0 value causes this loop to be skipped.
]
++++++++               Set Cell #0 to 8
[
    >++++               Add 4 to Cell #1; this will always set Cell #1 to 4
    [                   as the cell will be cleared by the loop
        >++             Add 2 to Cell #2
        >+++            Add 3 to Cell #3
        >+++            Add 3 to Cell #4
        >+              Add 1 to Cell #5
        <<<<-           Decrement the loop counter in Cell #1
    ]                   Loop till Cell #1 is zero; number of iterations is 4
    >+                  Add 1 to Cell #2
    >+                  Add 1 to Cell #3
    >-                  Subtract 1 from Cell #4
    >>+                 Add 1 to Cell #6
    [<]                 Move back to the first zero cell you find; this will
                        be Cell #1 which was cleared by the previous loop
    <-                  Decrement the loop Counter in Cell #0
]                       Loop till Cell #0 is zero; number of iterations is 8

The result of this is:
Cell No :   0   1   2   3   4   5   6
Contents:   0   0  72 104  88  32   8
Pointer :   ^

>>.                     Cell #2 has value 72 which is 'H'
>---.                   Subtract 3 from Cell #3 to get 101 which is 'e'
+++++++..+++.           Likewise for 'llo' from Cell #3
>>.                     Cell #5 is 32 for the space
<-.                     Subtract 1 from Cell #4 for 87 to give a 'W'
<.                      Cell #3 was set to 'o' from the end of 'Hello'
+++.------.--------.    Cell #3 for 'rl' and 'd'
>>+.                    Add 1 to Cell #5 gives us an exclamation point
>++.                    And finally a newline from Cell #6
Enter fullscreen mode Exit fullscreen mode

Config

Check config.json first, quick information about config.json;

{
    "MEM": 20, // MEM is the total cells for our brainfuck program.
    "DUMP_FILE": "./result/dump.py", // The dump file that will write when program finished and got some informations about the code. 
    "COMPILE_FILE": "./result/compiled.py", // The file that will write when brainfuck code turned into python code.
    "LOG_FILE": "./result/logs.txt", // Log file for our program actions.
    "DEBUG": true // Allow debug mode for compiler, will log everything to console.
}
Enter fullscreen mode Exit fullscreen mode

Usage

Simple Usage;
python compiler.py ./example/fibonacci.bf

Output: ... 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 ...

And also you can check ./result/dump.py for some informations about program;

# DUMP RESULT | 13/05/2021 16:59:13
# =======================================================
# TOTAL CELL GIVEN: 20
# TOTAL CELL USED: 4
# TOTAL BYTE USED: 309
# MEMORY DUMP: [
    # CELL_0 -> 0 BYTE
    # CELL_1 -> 144 BYTE
    # CELL_2 -> 89 BYTE
    # CELL_3 -> 0 BYTE
    # CELL_4 -> 0 BYTE
    # CELL_5 -> 44 BYTE
    # CELL_6 -> 32 BYTE
    # CELL_7 -> 0 BYTE
    # CELL_8 -> 0 BYTE
    # CELL_9 -> 0 BYTE
    # CELL_10 -> 0 BYTE
    # CELL_11 -> 0 BYTE
    # CELL_12 -> 0 BYTE
    # CELL_13 -> 0 BYTE
    # CELL_14 -> 0 BYTE
    # CELL_15 -> 0 BYTE
    # CELL_16 -> 0 BYTE
    # CELL_17 -> 0 BYTE
    # CELL_18 -> 0 BYTE
    # CELL_19 -> 0 BYTE
# ]

# MINIFIED VERSION: [
    # LINE_1 -> +++++++++++>+>>>>++++++++++++++++++++++++++++++++++++++++++++>++++++++++++++++++
    # LINE_2 -> ++++++++++++++<<<<<<[>[>>>>>>+>+<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[
    # LINE_3 -> -<-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<<-]>>[-]]<<]>>>[>>+>+<<<-]>>>[
    # LINE_4 -> <<<+>>>-]+<[>[-]<[-]]>[<<+>>[-]]<<<<<<<]>>>>>[++++++++++++++++++++++++++++++++++
    # LINE_5 -> ++++++++++++++.[-]]++++++++++<[->-<]>+++++++++++++++++++++++++++++++++++++++++++
    # LINE_6 -> +++++.[-]<<<<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<<[-]]<<[>>+>+<<<-]>>
    # LINE_7 -> >[<<<+>>>-]<<[<+>-]>[<+>-]<<<-]
# ]
# =======================================================

# Code Starts Here ...
Enter fullscreen mode Exit fullscreen mode

Notes

This program may have some bugs. If you found a bug, please contribute!

Oldest comments (4)

Collapse
 
raksix profile image
Raksix

nice

Collapse
 
5elenay profile image
5elenay

thanks!

Collapse
 
olus2000 profile image
Alex Esoposting

Wait, so you compile brainfuck into valid python code? That's so beautifully useless, a gorgeous overkill. I love it!

Collapse
 
5elenay profile image
5elenay

Yeah it compile brainf*ck code to python code, thanks!