An open API service indexing awesome lists of open source software.

https://github.com/andcool-systems/brainfuck

Brainfuck language python interpreter
https://github.com/andcool-systems/brainfuck

brainfuck-interpreter interpreter python3

Last synced: 2 months ago
JSON representation

Brainfuck language python interpreter

Awesome Lists containing this project

README

        

# Python BrainFuckA interpreter
[![wakatime](https://wakatime.com/badge/user/391a38bf-e366-4a08-8107-7e6a23ad440a/project/b974b541-44fa-4d2d-b985-85a73db7f627.svg)](https://wakatime.com/badge/user/391a38bf-e366-4a08-8107-7e6a23ad440a/project/b974b541-44fa-4d2d-b985-85a73db7f627)

Интерпретатор языка BrainFuckA, написанный на языке Python.

BrainFuckA - это brainfuck-подобный язык программирования с дополнениями для удобства (см. список команд).

Код, написанный на оригинальном BrainFuck так же будет корректно работать.

## Использование
Для запуска вам не нужны сторонние модули, что бы запустить .bf скрипт просто выполните в консоли следующую команду:
```bash
python interpreter.py main.bf
```

Для запуска уже собранного интерпретатора просто укажите имя файла интерпретатора, а после имя файла со скриптом BrainFuckA:

- В Windows:
```bash
./interpreter.exe main.bf
```

- В Linux/Unix:
```bash
./interpreter main.bf
```

> Если вы видите ошибку `permission denied: ./interpreter` при запуске в Linux, то назначьте файл исполняемым командой `sudo chmod +x interpreter`

После названия скрипта интерпретатора идёт название файла со скриптом brainfuck.
Поддерживаемые расширения файлов:
- .bf
- .b


После имени файла, в команде запуска скрипта, можно указать параметр `format`, тогда исходный файл со скриптом будет перезаписан на отформатированный скрипт.
## Параметры интерпретатора
После первого запуска скрипта в папке с интерпретатором создастся файл **params.json**, открыв его Вы сможете найти в нём следующие параметры:

|Параметр |Значение по умолчанию |Возможные значения | Описание|
|----------------|-------------------------------|-------------------|---------|
|`memorySize` |30.000 |Любое числовое значение. |Количество ячеек памяти, выделенных под программу |
|`memoryManagement` |OFF |`OFF`/`AUTO`/`JUMP` | `OFF` — строгое выделение памяти, при вводе некорректного индекса ячейки вызывает ошибку.
`AUTO` — 1 ячейка по умолчанию, при использовании оператора `>` при несуществующем индексе ячейки памяти добавляется новая со значением, равным 0.
`JUMP` — При выборе ячейки памяти менее 0 или более выделенного размера происходит перенос выбора ячейки с нулевой на последнюю, с последней на нулевую.
|`type` |CLASSIC |`CLASSIC`/`ADVANCED`|`CLASSIC` — Классический интерпретатор, имеет размер ячеек 8 бит может быть переполнен.
`ADVANCED` — Стандартный размер переменных Python, не может быть переполнен.

> В режиме управления памятью AUTO, параметр memorySize отвечает за ограничение размера выделяемой памяти, ограничение можно отключить, установив параметр в значение -1
## Cписок команд
|Оператор| Описание|
|-- |--|
|+ |Прибавление единицы к текущей ячейке на 1|
|\- |Уменьшение значения текущей ячейки на 1|
|> |Сдвиг выбранной ячейки вправо|
|< |Сдвиг выбранной ячейки влево|
|. |Вывести значение текущей ячейки в кодировке ASCII(может быть применён декоратор `*`, см. ниже)|
|, |Ввести числовое значение в текущую ячейку (может быть применён декоратор `*`, см. ниже)|
|[ |Начать цикл, пока значение текущей ячейки не равно нулю|
|] |Конец цикла (см. выше)|
|GH |Создать портал с именем `H` (имена по аналогии)|
|gH |Перейти к порталу с именем `H` и продолжить выполнение после него|
|c |Копировать значение из текущей ячейки|
|p |Вставить ранее скопированное значение в текущую ячейку|
|' |Напечатать символ табуляции|
|" |Напечатать символ переноса строки|
|# |Комментарий, пример: `#Это комментарий!#`|
|0 |Обнуление текущей ячейки|


Декоратор `*` применяется к операторам `.` и `,` для изменения типа ввода, ставиться перед нужным оператором, примеры: `*. *,`.

При применении декоратора к оператору `.` он начинает выводить сырые значения из ячейки (то-есть числовое значение), в ином случае выводит символ, соответствующий таблице ASCII.

При применении декоратора к оператору `,` будет происходить конвертация введённого символа в код ASCII, иначе происходит ввод сырого числового значения, без конвертации.