Repository files navigation

BrainfuckScript 🧠💻➡️🤯

License: GPL v3

Compile a C-like language directly into Brainfuck!

🌐 Try it online:https://bfscript.streamlit.app/ | 📝 Read how it was built

BrainfuckScript is a compiler written in Python that translates a more familiar, C-inspired syntax into notoriously minimalistic Brainfuck code. It aims to make developing complex Brainfuck programs feasible by providing higher-level abstractions like variables, loops, and conditional statements.

This project uses a 32-bit cell architecture for the target Brainfuck environment, allowing for larger numerical values compared to the traditional 8-bit model.

🤔 What is Brainfuck?

Before diving into BrainfuckScript, it helps to understand what it compiles to. Brainfuck is an esoteric programming language known for its extreme minimalism. It consists of only eight commands:

CommandDescription
>Increment the data pointer.
<Decrement the data pointer.
+Increment the byte at the pointer.
-Decrement the byte at the pointer.
.Output the byte at the pointer.
,Input a byte to the pointer.
[Jump forward if byte is zero.
]Jump backward if byte is non-zero.

A simple "Hello World!" program in Brainfuck looks something like this:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

As you can see, writing anything non-trivial directly in Brainfuck is a significant challenge. BrainfuckScript bridges this gap!

✨ Key Features

  • C-like Syntax: Write code using familiar constructs like variables (size_t), if/else, while loops, and basic arithmetic.
  • Brainfuck Compilation: Generates functional Brainfuck code as output.
  • 32-Bit Cells: Targets a Brainfuck environment with 32-bit cells, enabling larger numbers.
  • Python Implementation: Built with modern Python (>=3.13) and Poetry.
  • Lark Parser: Uses the Lark library for robust parsing based on a defined grammar.
  • Included Interpreter: Comes with a basic Brainfuck interpreter (also using 32-bit cells) to run the compiled code.

🚀 Getting Started

Prerequisites

  • Python: Version 3.13 or higher.
  • Poetry: A Python dependency management tool. (Installation Guide)

Installation

  1. Clone the repository:
    git clone https://github.com/ImGajeed76/bfscript.git
  2. Navigate to the project directory:
    cd bfscript
  3. Install dependencies using Poetry:
    poetry install

🛠️ Usage

Web Version

You can also use BrainfuckScript directly in your browser at https://bfscript.streamlit.app/

Compiling BrainfuckScript (.bfs) to Brainfuck (.bf)

Use the compiler.py script to translate your BrainfuckScript code:

poetry run python compiler.py <input_file.bfs><output_file.bf>

Example:

poetry run python compiler.py examples/pyramid.bfs pyramid.bf

This will read the code in examples/pyramid.bfs and write the compiled Brainfuck code to pyramid.bf.

Running Compiled Brainfuck Code (.bf)

Use the included interpreter.py to execute the generated Brainfuck code:

poetry run python interpreter.py <brainfuck_file.bf>

Example:

poetry run python interpreter.py pyramid.bf

This will run the Brainfuck code stored in pyramid.bf.

With Input:

If your Brainfuck code requires input, you can provide it like this:

poetry run python interpreter.py pyramid.bf "Some input"

Other Options:

poetry run python interpreter.py your_script.bf "Input" -m 60000 -b 8 -t 10.0
OptionDescription
-mSet the memory size (default: 30000 cells).
-bSet the cell size in bits (default: 32).
-tSet the timeout in seconds (default: 5.0).

📝 Syntax Example

BrainfuckScript uses a syntax reminiscent of C. Here's an example that prints a pyramid pattern:

// --- Pyramid Printer ---// Prints a pyramid of '*' characters using nested loops.// Avoids multiplication by incrementing the character count per row.size_theight=7; // Declare and initialize a variablesize_tcurrent_row=1;
size_tchars_for_this_row=1;
// Loop for each rowwhile (current_row <= height) {
// --- Print leading spaces ---size_tspaces_needed=height-current_row;
size_tspaces_printed=0;
while (spaces_printed<spaces_needed) {
output(' '); // Output a character literalspaces_printed=spaces_printed+1;
}
// --- Print the characters ('*') ---size_tchars_printed=0;
while (chars_printed<chars_for_this_row) {
output('*');
chars_printed=chars_printed+1;
}
// --- Print a newline character ---output('
');
// --- Prepare for the next row ---current_row=current_row+1;
// Add 2 characters for the next row (1 -> 3 -> 5 -> ...)chars_for_this_row=chars_for_this_row+2;
}
// No explicit return needed for top-level code

🚧 Current Status & Limitations

This project is currently under development. The following features are not yet implemented:

  • Variable Multiplication (*): Multiplication involving two variables is not supported. Constant folding works ( e.g., 5 * 2).
  • Variable Division (/): Division involving two variables is not supported. Constant folding works (e.g., 10 / 2).
  • Functions: Defining and calling custom functions (void myFunc() { ... }) is not yet implemented.
  • Stacks: The stack data type and its associated operations (.push(), .pop(), .peek()) are not yet implemented.

These features are planned for future development!

🤝 Contributing

Contributions, issues, and feature requests are welcome! Feel free to check the issues page. Please open an issue first to discuss what you would like to change.

📜 License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.


Happy Brainfucking (the easier way)! 🎉


Built with ❤️ by Oliver Seifert

About

Compile C-like code directly to Brainfuck with a Python compiler featuring 32-bit cells and high-level abstractions.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

BrainfuckScript 🧠💻➡️🤯

License: GPL v3

Compile a C-like language directly into Brainfuck!

🌐 Try it online:https://bfscript.streamlit.app/ | 📝 Read how it was built

BrainfuckScript is a compiler written in Python that translates a more familiar, C-inspired syntax into notoriously minimalistic Brainfuck code. It aims to make developing complex Brainfuck programs feasible by providing higher-level abstractions like variables, loops, and conditional statements.

This project uses a 32-bit cell architecture for the target Brainfuck environment, allowing for larger numerical values compared to the traditional 8-bit model.

🤔 What is Brainfuck?

Before diving into BrainfuckScript, it helps to understand what it compiles to. Brainfuck is an esoteric programming language known for its extreme minimalism. It consists of only eight commands:

CommandDescription
>Increment the data pointer.
<Decrement the data pointer.
+Increment the byte at the pointer.
-Decrement the byte at the pointer.
.Output the byte at the pointer.
,Input a byte to the pointer.
[Jump forward if byte is zero.
]Jump backward if byte is non-zero.

A simple "Hello World!" program in Brainfuck looks something like this:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

As you can see, writing anything non-trivial directly in Brainfuck is a significant challenge. BrainfuckScript bridges this gap!

✨ Key Features

  • C-like Syntax: Write code using familiar constructs like variables (size_t), if/else, while loops, and basic arithmetic.
  • Brainfuck Compilation: Generates functional Brainfuck code as output.
  • 32-Bit Cells: Targets a Brainfuck environment with 32-bit cells, enabling larger numbers.
  • Python Implementation: Built with modern Python (>=3.13) and Poetry.
  • Lark Parser: Uses the Lark library for robust parsing based on a defined grammar.
  • Included Interpreter: Comes with a basic Brainfuck interpreter (also using 32-bit cells) to run the compiled code.

🚀 Getting Started

Prerequisites

  • Python: Version 3.13 or higher.
  • Poetry: A Python dependency management tool. (Installation Guide)

Installation

  1. Clone the repository:
    git clone https://github.com/ImGajeed76/bfscript.git
  2. Navigate to the project directory:
    cd bfscript
  3. Install dependencies using Poetry:
    poetry install

🛠️ Usage

Web Version

You can also use BrainfuckScript directly in your browser at https://bfscript.streamlit.app/

Compiling BrainfuckScript (.bfs) to Brainfuck (.bf)

Use the compiler.py script to translate your BrainfuckScript code:

poetry run python compiler.py <input_file.bfs><output_file.bf>

Example:

poetry run python compiler.py examples/pyramid.bfs pyramid.bf

This will read the code in examples/pyramid.bfs and write the compiled Brainfuck code to pyramid.bf.

Running Compiled Brainfuck Code (.bf)

Use the included interpreter.py to execute the generated Brainfuck code:

poetry run python interpreter.py <brainfuck_file.bf>

Example:

poetry run python interpreter.py pyramid.bf

This will run the Brainfuck code stored in pyramid.bf.

With Input:

If your Brainfuck code requires input, you can provide it like this:

poetry run python interpreter.py pyramid.bf "Some input"

Other Options:

poetry run python interpreter.py your_script.bf "Input" -m 60000 -b 8 -t 10.0
OptionDescription
-mSet the memory size (default: 30000 cells).
-bSet the cell size in bits (default: 32).
-tSet the timeout in seconds (default: 5.0).

📝 Syntax Example

BrainfuckScript uses a syntax reminiscent of C. Here's an example that prints a pyramid pattern:

// --- Pyramid Printer ---// Prints a pyramid of '*' characters using nested loops.// Avoids multiplication by incrementing the character count per row.size_theight=7; // Declare and initialize a variablesize_tcurrent_row=1;
size_tchars_for_this_row=1;
// Loop for each rowwhile (current_row <= height) {
// --- Print leading spaces ---size_tspaces_needed=height-current_row;
size_tspaces_printed=0;
while (spaces_printed<spaces_needed) {
output(' '); // Output a character literalspaces_printed=spaces_printed+1;
}
// --- Print the characters ('*') ---size_tchars_printed=0;
while (chars_printed<chars_for_this_row) {
output('*');
chars_printed=chars_printed+1;
}
// --- Print a newline character ---output('
');
// --- Prepare for the next row ---current_row=current_row+1;
// Add 2 characters for the next row (1 -> 3 -> 5 -> ...)chars_for_this_row=chars_for_this_row+2;
}
// No explicit return needed for top-level code

🚧 Current Status & Limitations

This project is currently under development. The following features are not yet implemented:

  • Variable Multiplication (*): Multiplication involving two variables is not supported. Constant folding works ( e.g., 5 * 2).
  • Variable Division (/): Division involving two variables is not supported. Constant folding works (e.g., 10 / 2).
  • Functions: Defining and calling custom functions (void myFunc() { ... }) is not yet implemented.
  • Stacks: The stack data type and its associated operations (.push(), .pop(), .peek()) are not yet implemented.

These features are planned for future development!

🤝 Contributing

Contributions, issues, and feature requests are welcome! Feel free to check the issues page. Please open an issue first to discuss what you would like to change.

📜 License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.


Happy Brainfucking (the easier way)! 🎉


Built with ❤️ by Oliver Seifert

About

Compile C-like code directly to Brainfuck with a Python compiler featuring 32-bit cells and high-level abstractions.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

BrainfuckScript 🧠💻➡️🤯

License: GPL v3

Compile a C-like language directly into Brainfuck!

🌐 Try it online:https://bfscript.streamlit.app/ | 📝 Read how it was built

BrainfuckScript is a compiler written in Python that translates a more familiar, C-inspired syntax into notoriously minimalistic Brainfuck code. It aims to make developing complex Brainfuck programs feasible by providing higher-level abstractions like variables, loops, and conditional statements.

This project uses a 32-bit cell architecture for the target Brainfuck environment, allowing for larger numerical values compared to the traditional 8-bit model.

🤔 What is Brainfuck?

Before diving into BrainfuckScript, it helps to understand what it compiles to. Brainfuck is an esoteric programming language known for its extreme minimalism. It consists of only eight commands:

CommandDescription
>Increment the data pointer.
<Decrement the data pointer.
+Increment the byte at the pointer.
-Decrement the byte at the pointer.
.Output the byte at the pointer.
,Input a byte to the pointer.
[Jump forward if byte is zero.
]Jump backward if byte is non-zero.

A simple "Hello World!" program in Brainfuck looks something like this:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

As you can see, writing anything non-trivial directly in Brainfuck is a significant challenge. BrainfuckScript bridges this gap!

✨ Key Features

  • C-like Syntax: Write code using familiar constructs like variables (size_t), if/else, while loops, and basic arithmetic.
  • Brainfuck Compilation: Generates functional Brainfuck code as output.
  • 32-Bit Cells: Targets a Brainfuck environment with 32-bit cells, enabling larger numbers.
  • Python Implementation: Built with modern Python (>=3.13) and Poetry.
  • Lark Parser: Uses the Lark library for robust parsing based on a defined grammar.
  • Included Interpreter: Comes with a basic Brainfuck interpreter (also using 32-bit cells) to run the compiled code.

🚀 Getting Started

Prerequisites

  • Python: Version 3.13 or higher.
  • Poetry: A Python dependency management tool. (Installation Guide)

Installation

  1. Clone the repository:
    git clone https://github.com/ImGajeed76/bfscript.git
  2. Navigate to the project directory:
    cd bfscript
  3. Install dependencies using Poetry:
    poetry install

🛠️ Usage

Web Version

You can also use BrainfuckScript directly in your browser at https://bfscript.streamlit.app/

Compiling BrainfuckScript (.bfs) to Brainfuck (.bf)

Use the compiler.py script to translate your BrainfuckScript code:

poetry run python compiler.py <input_file.bfs><output_file.bf>

Example:

poetry run python compiler.py examples/pyramid.bfs pyramid.bf

This will read the code in examples/pyramid.bfs and write the compiled Brainfuck code to pyramid.bf.

Running Compiled Brainfuck Code (.bf)

Use the included interpreter.py to execute the generated Brainfuck code:

poetry run python interpreter.py <brainfuck_file.bf>

Example:

poetry run python interpreter.py pyramid.bf

This will run the Brainfuck code stored in pyramid.bf.

With Input:

If your Brainfuck code requires input, you can provide it like this:

poetry run python interpreter.py pyramid.bf "Some input"

Other Options:

poetry run python interpreter.py your_script.bf "Input" -m 60000 -b 8 -t 10.0
OptionDescription
-mSet the memory size (default: 30000 cells).
-bSet the cell size in bits (default: 32).
-tSet the timeout in seconds (default: 5.0).

📝 Syntax Example

BrainfuckScript uses a syntax reminiscent of C. Here's an example that prints a pyramid pattern:

// --- Pyramid Printer ---// Prints a pyramid of '*' characters using nested loops.// Avoids multiplication by incrementing the character count per row.size_theight=7; // Declare and initialize a variablesize_tcurrent_row=1;
size_tchars_for_this_row=1;
// Loop for each rowwhile (current_row <= height) {
// --- Print leading spaces ---size_tspaces_needed=height-current_row;
size_tspaces_printed=0;
while (spaces_printed<spaces_needed) {
output(' '); // Output a character literalspaces_printed=spaces_printed+1;
}
// --- Print the characters ('*') ---size_tchars_printed=0;
while (chars_printed<chars_for_this_row) {
output('*');
chars_printed=chars_printed+1;
}
// --- Print a newline character ---output('
');
// --- Prepare for the next row ---current_row=current_row+1;
// Add 2 characters for the next row (1 -> 3 -> 5 -> ...)chars_for_this_row=chars_for_this_row+2;
}
// No explicit return needed for top-level code

🚧 Current Status & Limitations

This project is currently under development. The following features are not yet implemented:

  • Variable Multiplication (*): Multiplication involving two variables is not supported. Constant folding works ( e.g., 5 * 2).
  • Variable Division (/): Division involving two variables is not supported. Constant folding works (e.g., 10 / 2).
  • Functions: Defining and calling custom functions (void myFunc() { ... }) is not yet implemented.
  • Stacks: The stack data type and its associated operations (.push(), .pop(), .peek()) are not yet implemented.

These features are planned for future development!

🤝 Contributing

Contributions, issues, and feature requests are welcome! Feel free to check the issues page. Please open an issue first to discuss what you would like to change.

📜 License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.


Happy Brainfucking (the easier way)! 🎉


Built with ❤️ by Oliver Seifert

About

Compile C-like code directly to Brainfuck with a Python compiler featuring 32-bit cells and high-level abstractions.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

BrainfuckScript 🧠💻➡️🤯

License: GPL v3

Compile a C-like language directly into Brainfuck!

🌐 Try it online:https://bfscript.streamlit.app/ | 📝 Read how it was built

BrainfuckScript is a compiler written in Python that translates a more familiar, C-inspired syntax into notoriously minimalistic Brainfuck code. It aims to make developing complex Brainfuck programs feasible by providing higher-level abstractions like variables, loops, and conditional statements.

This project uses a 32-bit cell architecture for the target Brainfuck environment, allowing for larger numerical values compared to the traditional 8-bit model.

🤔 What is Brainfuck?

Before diving into BrainfuckScript, it helps to understand what it compiles to. Brainfuck is an esoteric programming language known for its extreme minimalism. It consists of only eight commands:

CommandDescription
>Increment the data pointer.
<Decrement the data pointer.
+Increment the byte at the pointer.
-Decrement the byte at the pointer.
.Output the byte at the pointer.
,Input a byte to the pointer.
[Jump forward if byte is zero.
]Jump backward if byte is non-zero.

A simple "Hello World!" program in Brainfuck looks something like this:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

As you can see, writing anything non-trivial directly in Brainfuck is a significant challenge. BrainfuckScript bridges this gap!

✨ Key Features

  • C-like Syntax: Write code using familiar constructs like variables (size_t), if/else, while loops, and basic arithmetic.
  • Brainfuck Compilation: Generates functional Brainfuck code as output.
  • 32-Bit Cells: Targets a Brainfuck environment with 32-bit cells, enabling larger numbers.
  • Python Implementation: Built with modern Python (>=3.13) and Poetry.
  • Lark Parser: Uses the Lark library for robust parsing based on a defined grammar.
  • Included Interpreter: Comes with a basic Brainfuck interpreter (also using 32-bit cells) to run the compiled code.

🚀 Getting Started

Prerequisites

  • Python: Version 3.13 or higher.
  • Poetry: A Python dependency management tool. (Installation Guide)

Installation

  1. Clone the repository:
    git clone https://github.com/ImGajeed76/bfscript.git
  2. Navigate to the project directory:
    cd bfscript
  3. Install dependencies using Poetry:
    poetry install

🛠️ Usage

Web Version

You can also use BrainfuckScript directly in your browser at https://bfscript.streamlit.app/

Compiling BrainfuckScript (.bfs) to Brainfuck (.bf)

Use the compiler.py script to translate your BrainfuckScript code:

poetry run python compiler.py <input_file.bfs><output_file.bf>

Example:

poetry run python compiler.py examples/pyramid.bfs pyramid.bf

This will read the code in examples/pyramid.bfs and write the compiled Brainfuck code to pyramid.bf.

Running Compiled Brainfuck Code (.bf)

Use the included interpreter.py to execute the generated Brainfuck code:

poetry run python interpreter.py <brainfuck_file.bf>

Example:

poetry run python interpreter.py pyramid.bf

This will run the Brainfuck code stored in pyramid.bf.

With Input:

If your Brainfuck code requires input, you can provide it like this:

poetry run python interpreter.py pyramid.bf "Some input"

Other Options:

poetry run python interpreter.py your_script.bf "Input" -m 60000 -b 8 -t 10.0
OptionDescription
-mSet the memory size (default: 30000 cells).
-bSet the cell size in bits (default: 32).
-tSet the timeout in seconds (default: 5.0).

📝 Syntax Example

BrainfuckScript uses a syntax reminiscent of C. Here's an example that prints a pyramid pattern:

// --- Pyramid Printer ---// Prints a pyramid of '*' characters using nested loops.// Avoids multiplication by incrementing the character count per row.size_theight=7; // Declare and initialize a variablesize_tcurrent_row=1;
size_tchars_for_this_row=1;
// Loop for each rowwhile (current_row <= height) {
// --- Print leading spaces ---size_tspaces_needed=height-current_row;
size_tspaces_printed=0;
while (spaces_printed<spaces_needed) {
output(' '); // Output a character literalspaces_printed=spaces_printed+1;
}
// --- Print the characters ('*') ---size_tchars_printed=0;
while (chars_printed<chars_for_this_row) {
output('*');
chars_printed=chars_printed+1;
}
// --- Print a newline character ---output('
');
// --- Prepare for the next row ---current_row=current_row+1;
// Add 2 characters for the next row (1 -> 3 -> 5 -> ...)chars_for_this_row=chars_for_this_row+2;
}
// No explicit return needed for top-level code

🚧 Current Status & Limitations

This project is currently under development. The following features are not yet implemented:

  • Variable Multiplication (*): Multiplication involving two variables is not supported. Constant folding works ( e.g., 5 * 2).
  • Variable Division (/): Division involving two variables is not supported. Constant folding works (e.g., 10 / 2).
  • Functions: Defining and calling custom functions (void myFunc() { ... }) is not yet implemented.
  • Stacks: The stack data type and its associated operations (.push(), .pop(), .peek()) are not yet implemented.

These features are planned for future development!

🤝 Contributing

Contributions, issues, and feature requests are welcome! Feel free to check the issues page. Please open an issue first to discuss what you would like to change.

📜 License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.


Happy Brainfucking (the easier way)! 🎉


Built with ❤️ by Oliver Seifert

About

Compile C-like code directly to Brainfuck with a Python compiler featuring 32-bit cells and high-level abstractions.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

BrainfuckScript 🧠💻➡️🤯

License: GPL v3

Compile a C-like language directly into Brainfuck!

🌐 Try it online:https://bfscript.streamlit.app/ | 📝 Read how it was built

BrainfuckScript is a compiler written in Python that translates a more familiar, C-inspired syntax into notoriously minimalistic Brainfuck code. It aims to make developing complex Brainfuck programs feasible by providing higher-level abstractions like variables, loops, and conditional statements.

This project uses a 32-bit cell architecture for the target Brainfuck environment, allowing for larger numerical values compared to the traditional 8-bit model.

🤔 What is Brainfuck?

Before diving into BrainfuckScript, it helps to understand what it compiles to. Brainfuck is an esoteric programming language known for its extreme minimalism. It consists of only eight commands:

CommandDescription
>Increment the data pointer.
<Decrement the data pointer.
+Increment the byte at the pointer.
-Decrement the byte at the pointer.
.Output the byte at the pointer.
,Input a byte to the pointer.
[Jump forward if byte is zero.
]Jump backward if byte is non-zero.

A simple "Hello World!" program in Brainfuck looks something like this:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

As you can see, writing anything non-trivial directly in Brainfuck is a significant challenge. BrainfuckScript bridges this gap!

✨ Key Features

  • C-like Syntax: Write code using familiar constructs like variables (size_t), if/else, while loops, and basic arithmetic.
  • Brainfuck Compilation: Generates functional Brainfuck code as output.
  • 32-Bit Cells: Targets a Brainfuck environment with 32-bit cells, enabling larger numbers.
  • Python Implementation: Built with modern Python (>=3.13) and Poetry.
  • Lark Parser: Uses the Lark library for robust parsing based on a defined grammar.
  • Included Interpreter: Comes with a basic Brainfuck interpreter (also using 32-bit cells) to run the compiled code.

🚀 Getting Started

Prerequisites

  • Python: Version 3.13 or higher.
  • Poetry: A Python dependency management tool. (Installation Guide)

Installation

  1. Clone the repository:
    git clone https://github.com/ImGajeed76/bfscript.git
  2. Navigate to the project directory:
    cd bfscript
  3. Install dependencies using Poetry:
    poetry install

🛠️ Usage

Web Version

You can also use BrainfuckScript directly in your browser at https://bfscript.streamlit.app/

Compiling BrainfuckScript (.bfs) to Brainfuck (.bf)

Use the compiler.py script to translate your BrainfuckScript code:

poetry run python compiler.py <input_file.bfs><output_file.bf>

Example:

poetry run python compiler.py examples/pyramid.bfs pyramid.bf

This will read the code in examples/pyramid.bfs and write the compiled Brainfuck code to pyramid.bf.

Running Compiled Brainfuck Code (.bf)

Use the included interpreter.py to execute the generated Brainfuck code:

poetry run python interpreter.py <brainfuck_file.bf>

Example:

poetry run python interpreter.py pyramid.bf

This will run the Brainfuck code stored in pyramid.bf.

With Input:

If your Brainfuck code requires input, you can provide it like this:

poetry run python interpreter.py pyramid.bf "Some input"

Other Options:

poetry run python interpreter.py your_script.bf "Input" -m 60000 -b 8 -t 10.0
OptionDescription
-mSet the memory size (default: 30000 cells).
-bSet the cell size in bits (default: 32).
-tSet the timeout in seconds (default: 5.0).

📝 Syntax Example

BrainfuckScript uses a syntax reminiscent of C. Here's an example that prints a pyramid pattern:

// --- Pyramid Printer ---// Prints a pyramid of '*' characters using nested loops.// Avoids multiplication by incrementing the character count per row.size_theight=7; // Declare and initialize a variablesize_tcurrent_row=1;
size_tchars_for_this_row=1;
// Loop for each rowwhile (current_row <= height) {
// --- Print leading spaces ---size_tspaces_needed=height-current_row;
size_tspaces_printed=0;
while (spaces_printed<spaces_needed) {
output(' '); // Output a character literalspaces_printed=spaces_printed+1;
}
// --- Print the characters ('*') ---size_tchars_printed=0;
while (chars_printed<chars_for_this_row) {
output('*');
chars_printed=chars_printed+1;
}
// --- Print a newline character ---output('
');
// --- Prepare for the next row ---current_row=current_row+1;
// Add 2 characters for the next row (1 -> 3 -> 5 -> ...)chars_for_this_row=chars_for_this_row+2;
}
// No explicit return needed for top-level code

🚧 Current Status & Limitations

This project is currently under development. The following features are not yet implemented:

  • Variable Multiplication (*): Multiplication involving two variables is not supported. Constant folding works ( e.g., 5 * 2).
  • Variable Division (/): Division involving two variables is not supported. Constant folding works (e.g., 10 / 2).
  • Functions: Defining and calling custom functions (void myFunc() { ... }) is not yet implemented.
  • Stacks: The stack data type and its associated operations (.push(), .pop(), .peek()) are not yet implemented.

These features are planned for future development!

🤝 Contributing

Contributions, issues, and feature requests are welcome! Feel free to check the issues page. Please open an issue first to discuss what you would like to change.

📜 License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.


Happy Brainfucking (the easier way)! 🎉


Built with ❤️ by Oliver Seifert

About

Compile C-like code directly to Brainfuck with a Python compiler featuring 32-bit cells and high-level abstractions.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

BrainfuckScript 🧠💻➡️🤯

License: GPL v3

Compile a C-like language directly into Brainfuck!

🌐 Try it online:https://bfscript.streamlit.app/ | 📝 Read how it was built

BrainfuckScript is a compiler written in Python that translates a more familiar, C-inspired syntax into notoriously minimalistic Brainfuck code. It aims to make developing complex Brainfuck programs feasible by providing higher-level abstractions like variables, loops, and conditional statements.

This project uses a 32-bit cell architecture for the target Brainfuck environment, allowing for larger numerical values compared to the traditional 8-bit model.

🤔 What is Brainfuck?

Before diving into BrainfuckScript, it helps to understand what it compiles to. Brainfuck is an esoteric programming language known for its extreme minimalism. It consists of only eight commands:

CommandDescription
>Increment the data pointer.
<Decrement the data pointer.
+Increment the byte at the pointer.
-Decrement the byte at the pointer.
.Output the byte at the pointer.
,Input a byte to the pointer.
[Jump forward if byte is zero.
]Jump backward if byte is non-zero.

A simple "Hello World!" program in Brainfuck looks something like this:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

As you can see, writing anything non-trivial directly in Brainfuck is a significant challenge. BrainfuckScript bridges this gap!

✨ Key Features

  • C-like Syntax: Write code using familiar constructs like variables (size_t), if/else, while loops, and basic arithmetic.
  • Brainfuck Compilation: Generates functional Brainfuck code as output.
  • 32-Bit Cells: Targets a Brainfuck environment with 32-bit cells, enabling larger numbers.
  • Python Implementation: Built with modern Python (>=3.13) and Poetry.
  • Lark Parser: Uses the Lark library for robust parsing based on a defined grammar.
  • Included Interpreter: Comes with a basic Brainfuck interpreter (also using 32-bit cells) to run the compiled code.

🚀 Getting Started

Prerequisites

  • Python: Version 3.13 or higher.
  • Poetry: A Python dependency management tool. (Installation Guide)

Installation

  1. Clone the repository:
    git clone https://github.com/ImGajeed76/bfscript.git
  2. Navigate to the project directory:
    cd bfscript
  3. Install dependencies using Poetry:
    poetry install

🛠️ Usage

Web Version

You can also use BrainfuckScript directly in your browser at https://bfscript.streamlit.app/

Compiling BrainfuckScript (.bfs) to Brainfuck (.bf)

Use the compiler.py script to translate your BrainfuckScript code:

poetry run python compiler.py <input_file.bfs><output_file.bf>

Example:

poetry run python compiler.py examples/pyramid.bfs pyramid.bf

This will read the code in examples/pyramid.bfs and write the compiled Brainfuck code to pyramid.bf.

Running Compiled Brainfuck Code (.bf)

Use the included interpreter.py to execute the generated Brainfuck code:

poetry run python interpreter.py <brainfuck_file.bf>

Example:

poetry run python interpreter.py pyramid.bf

This will run the Brainfuck code stored in pyramid.bf.

With Input:

If your Brainfuck code requires input, you can provide it like this:

poetry run python interpreter.py pyramid.bf "Some input"

Other Options:

poetry run python interpreter.py your_script.bf "Input" -m 60000 -b 8 -t 10.0
OptionDescription
-mSet the memory size (default: 30000 cells).
-bSet the cell size in bits (default: 32).
-tSet the timeout in seconds (default: 5.0).

📝 Syntax Example

BrainfuckScript uses a syntax reminiscent of C. Here's an example that prints a pyramid pattern:

// --- Pyramid Printer ---// Prints a pyramid of '*' characters using nested loops.// Avoids multiplication by incrementing the character count per row.size_theight=7; // Declare and initialize a variablesize_tcurrent_row=1;
size_tchars_for_this_row=1;
// Loop for each rowwhile (current_row <= height) {
// --- Print leading spaces ---size_tspaces_needed=height-current_row;
size_tspaces_printed=0;
while (spaces_printed<spaces_needed) {
output(' '); // Output a character literalspaces_printed=spaces_printed+1;
}
// --- Print the characters ('*') ---size_tchars_printed=0;
while (chars_printed<chars_for_this_row) {
output('*');
chars_printed=chars_printed+1;
}
// --- Print a newline character ---output('
');
// --- Prepare for the next row ---current_row=current_row+1;
// Add 2 characters for the next row (1 -> 3 -> 5 -> ...)chars_for_this_row=chars_for_this_row+2;
}
// No explicit return needed for top-level code

🚧 Current Status & Limitations

This project is currently under development. The following features are not yet implemented:

  • Variable Multiplication (*): Multiplication involving two variables is not supported. Constant folding works ( e.g., 5 * 2).
  • Variable Division (/): Division involving two variables is not supported. Constant folding works (e.g., 10 / 2).
  • Functions: Defining and calling custom functions (void myFunc() { ... }) is not yet implemented.
  • Stacks: The stack data type and its associated operations (.push(), .pop(), .peek()) are not yet implemented.

These features are planned for future development!

🤝 Contributing

Contributions, issues, and feature requests are welcome! Feel free to check the issues page. Please open an issue first to discuss what you would like to change.

📜 License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.


Happy Brainfucking (the easier way)! 🎉


Built with ❤️ by Oliver Seifert

About

Compile C-like code directly to Brainfuck with a Python compiler featuring 32-bit cells and high-level abstractions.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

BrainfuckScript 🧠💻➡️🤯

License: GPL v3

Compile a C-like language directly into Brainfuck!

🌐 Try it online:https://bfscript.streamlit.app/ | 📝 Read how it was built

BrainfuckScript is a compiler written in Python that translates a more familiar, C-inspired syntax into notoriously minimalistic Brainfuck code. It aims to make developing complex Brainfuck programs feasible by providing higher-level abstractions like variables, loops, and conditional statements.

This project uses a 32-bit cell architecture for the target Brainfuck environment, allowing for larger numerical values compared to the traditional 8-bit model.

🤔 What is Brainfuck?

Before diving into BrainfuckScript, it helps to understand what it compiles to. Brainfuck is an esoteric programming language known for its extreme minimalism. It consists of only eight commands:

CommandDescription
>Increment the data pointer.
<Decrement the data pointer.
+Increment the byte at the pointer.
-Decrement the byte at the pointer.
.Output the byte at the pointer.
,Input a byte to the pointer.
[Jump forward if byte is zero.
]Jump backward if byte is non-zero.

A simple "Hello World!" program in Brainfuck looks something like this:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

As you can see, writing anything non-trivial directly in Brainfuck is a significant challenge. BrainfuckScript bridges this gap!

✨ Key Features

  • C-like Syntax: Write code using familiar constructs like variables (size_t), if/else, while loops, and basic arithmetic.
  • Brainfuck Compilation: Generates functional Brainfuck code as output.
  • 32-Bit Cells: Targets a Brainfuck environment with 32-bit cells, enabling larger numbers.
  • Python Implementation: Built with modern Python (>=3.13) and Poetry.
  • Lark Parser: Uses the Lark library for robust parsing based on a defined grammar.
  • Included Interpreter: Comes with a basic Brainfuck interpreter (also using 32-bit cells) to run the compiled code.

🚀 Getting Started

Prerequisites

  • Python: Version 3.13 or higher.
  • Poetry: A Python dependency management tool. (Installation Guide)

Installation

  1. Clone the repository:
    git clone https://github.com/ImGajeed76/bfscript.git
  2. Navigate to the project directory:
    cd bfscript
  3. Install dependencies using Poetry:
    poetry install

🛠️ Usage

Web Version

You can also use BrainfuckScript directly in your browser at https://bfscript.streamlit.app/

Compiling BrainfuckScript (.bfs) to Brainfuck (.bf)

Use the compiler.py script to translate your BrainfuckScript code:

poetry run python compiler.py <input_file.bfs><output_file.bf>

Example:

poetry run python compiler.py examples/pyramid.bfs pyramid.bf

This will read the code in examples/pyramid.bfs and write the compiled Brainfuck code to pyramid.bf.

Running Compiled Brainfuck Code (.bf)

Use the included interpreter.py to execute the generated Brainfuck code:

poetry run python interpreter.py <brainfuck_file.bf>

Example:

poetry run python interpreter.py pyramid.bf

This will run the Brainfuck code stored in pyramid.bf.

With Input:

If your Brainfuck code requires input, you can provide it like this:

poetry run python interpreter.py pyramid.bf "Some input"

Other Options:

poetry run python interpreter.py your_script.bf "Input" -m 60000 -b 8 -t 10.0
OptionDescription
-mSet the memory size (default: 30000 cells).
-bSet the cell size in bits (default: 32).
-tSet the timeout in seconds (default: 5.0).

📝 Syntax Example

BrainfuckScript uses a syntax reminiscent of C. Here's an example that prints a pyramid pattern:

// --- Pyramid Printer ---// Prints a pyramid of '*' characters using nested loops.// Avoids multiplication by incrementing the character count per row.size_theight=7; // Declare and initialize a variablesize_tcurrent_row=1;
size_tchars_for_this_row=1;
// Loop for each rowwhile (current_row <= height) {
// --- Print leading spaces ---size_tspaces_needed=height-current_row;
size_tspaces_printed=0;
while (spaces_printed<spaces_needed) {
output(' '); // Output a character literalspaces_printed=spaces_printed+1;
}
// --- Print the characters ('*') ---size_tchars_printed=0;
while (chars_printed<chars_for_this_row) {
output('*');
chars_printed=chars_printed+1;
}
// --- Print a newline character ---output('
');
// --- Prepare for the next row ---current_row=current_row+1;
// Add 2 characters for the next row (1 -> 3 -> 5 -> ...)chars_for_this_row=chars_for_this_row+2;
}
// No explicit return needed for top-level code

🚧 Current Status & Limitations

This project is currently under development. The following features are not yet implemented:

  • Variable Multiplication (*): Multiplication involving two variables is not supported. Constant folding works ( e.g., 5 * 2).
  • Variable Division (/): Division involving two variables is not supported. Constant folding works (e.g., 10 / 2).
  • Functions: Defining and calling custom functions (void myFunc() { ... }) is not yet implemented.
  • Stacks: The stack data type and its associated operations (.push(), .pop(), .peek()) are not yet implemented.

These features are planned for future development!

🤝 Contributing

Contributions, issues, and feature requests are welcome! Feel free to check the issues page. Please open an issue first to discuss what you would like to change.

📜 License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.


Happy Brainfucking (the easier way)! 🎉


Built with ❤️ by Oliver Seifert

About

Compile C-like code directly to Brainfuck with a Python compiler featuring 32-bit cells and high-level abstractions.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

BrainfuckScript 🧠💻➡️🤯

License: GPL v3

Compile a C-like language directly into Brainfuck!

🌐 Try it online:https://bfscript.streamlit.app/ | 📝 Read how it was built

BrainfuckScript is a compiler written in Python that translates a more familiar, C-inspired syntax into notoriously minimalistic Brainfuck code. It aims to make developing complex Brainfuck programs feasible by providing higher-level abstractions like variables, loops, and conditional statements.

This project uses a 32-bit cell architecture for the target Brainfuck environment, allowing for larger numerical values compared to the traditional 8-bit model.

🤔 What is Brainfuck?

Before diving into BrainfuckScript, it helps to understand what it compiles to. Brainfuck is an esoteric programming language known for its extreme minimalism. It consists of only eight commands:

CommandDescription
>Increment the data pointer.
<Decrement the data pointer.
+Increment the byte at the pointer.
-Decrement the byte at the pointer.
.Output the byte at the pointer.
,Input a byte to the pointer.
[Jump forward if byte is zero.
]Jump backward if byte is non-zero.

A simple "Hello World!" program in Brainfuck looks something like this:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

As you can see, writing anything non-trivial directly in Brainfuck is a significant challenge. BrainfuckScript bridges this gap!

✨ Key Features

  • C-like Syntax: Write code using familiar constructs like variables (size_t), if/else, while loops, and basic arithmetic.
  • Brainfuck Compilation: Generates functional Brainfuck code as output.
  • 32-Bit Cells: Targets a Brainfuck environment with 32-bit cells, enabling larger numbers.
  • Python Implementation: Built with modern Python (>=3.13) and Poetry.
  • Lark Parser: Uses the Lark library for robust parsing based on a defined grammar.
  • Included Interpreter: Comes with a basic Brainfuck interpreter (also using 32-bit cells) to run the compiled code.

🚀 Getting Started

Prerequisites

  • Python: Version 3.13 or higher.
  • Poetry: A Python dependency management tool. (Installation Guide)

Installation

  1. Clone the repository:
    git clone https://github.com/ImGajeed76/bfscript.git
  2. Navigate to the project directory:
    cd bfscript
  3. Install dependencies using Poetry:
    poetry install

🛠️ Usage

Web Version

You can also use BrainfuckScript directly in your browser at https://bfscript.streamlit.app/

Compiling BrainfuckScript (.bfs) to Brainfuck (.bf)

Use the compiler.py script to translate your BrainfuckScript code:

poetry run python compiler.py <input_file.bfs><output_file.bf>

Example:

poetry run python compiler.py examples/pyramid.bfs pyramid.bf

This will read the code in examples/pyramid.bfs and write the compiled Brainfuck code to pyramid.bf.

Running Compiled Brainfuck Code (.bf)

Use the included interpreter.py to execute the generated Brainfuck code:

poetry run python interpreter.py <brainfuck_file.bf>

Example:

poetry run python interpreter.py pyramid.bf

This will run the Brainfuck code stored in pyramid.bf.

With Input:

If your Brainfuck code requires input, you can provide it like this:

poetry run python interpreter.py pyramid.bf "Some input"

Other Options:

poetry run python interpreter.py your_script.bf "Input" -m 60000 -b 8 -t 10.0
OptionDescription
-mSet the memory size (default: 30000 cells).
-bSet the cell size in bits (default: 32).
-tSet the timeout in seconds (default: 5.0).

📝 Syntax Example

BrainfuckScript uses a syntax reminiscent of C. Here's an example that prints a pyramid pattern:

// --- Pyramid Printer ---// Prints a pyramid of '*' characters using nested loops.// Avoids multiplication by incrementing the character count per row.size_theight=7; // Declare and initialize a variablesize_tcurrent_row=1;
size_tchars_for_this_row=1;
// Loop for each rowwhile (current_row <= height) {
// --- Print leading spaces ---size_tspaces_needed=height-current_row;
size_tspaces_printed=0;
while (spaces_printed<spaces_needed) {
output(' '); // Output a character literalspaces_printed=spaces_printed+1;
}
// --- Print the characters ('*') ---size_tchars_printed=0;
while (chars_printed<chars_for_this_row) {
output('*');
chars_printed=chars_printed+1;
}
// --- Print a newline character ---output('
');
// --- Prepare for the next row ---current_row=current_row+1;
// Add 2 characters for the next row (1 -> 3 -> 5 -> ...)chars_for_this_row=chars_for_this_row+2;
}
// No explicit return needed for top-level code

🚧 Current Status & Limitations

This project is currently under development. The following features are not yet implemented:

  • Variable Multiplication (*): Multiplication involving two variables is not supported. Constant folding works ( e.g., 5 * 2).
  • Variable Division (/): Division involving two variables is not supported. Constant folding works (e.g., 10 / 2).
  • Functions: Defining and calling custom functions (void myFunc() { ... }) is not yet implemented.
  • Stacks: The stack data type and its associated operations (.push(), .pop(), .peek()) are not yet implemented.

These features are planned for future development!

🤝 Contributing

Contributions, issues, and feature requests are welcome! Feel free to check the issues page. Please open an issue first to discuss what you would like to change.

📜 License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.


Happy Brainfucking (the easier way)! 🎉


Built with ❤️ by Oliver Seifert

About

Compile C-like code directly to Brainfuck with a Python compiler featuring 32-bit cells and high-level abstractions.

Resources

Stars

4 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages