Перейти к содержимому
Jakowlew

Интерпретатор brainfuck

Рекомендуемые сообщения

Brainfuck? Почему бы нет?

Если вы не знаете, что это, то вот ссыль: https://ru.wikipedia.org/wiki/Brainfuck

А вот и сам интерпретатор: https://pastebin.com/DVNbB7Rf

Текущая версия: 1.0

 

Документация:

 

 

-- Создать экземпляр интерпретатора
-- Входной параметр - строка с brainfuck кодом
b = bf:new("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.")
-- Запустить код
-- Вовзращает строку с ошибкой, если она произошла
b:run()
-- Проверить код на валидность. Код валиден, если вовзращенное значение == 0
valid = b:validate()
-- Получить строку с ошибкой, код которой вовзращает bf:validate()
str = b:getError(valid)
-- bf:run вызывает bf:validate() и bf:getError() внутри себя
-- Поэтому не надо проверять код на валидность самостоятельно 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Надо теперь расширить до NetFuck. =)

Ой как не хочется мучаться с сетью и параллельным выполнением. Я по фану написал за 20 минут интерпретатор brainfuck, чтобы запустить на нем интерпретатор brainfuck, написанный на brainfuck, а в нем еще один, и еще, и еще. А потом посмотрел, как это все работает, сказал себе "малаца" и запостил сюда :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А теперь сделай JIT-компилятор.

Можно сделать транслятор в Си код, который потом компилируется, вопрос в том, насколько это надо. Код все же для опенкомпов писался

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  if errorCode == 0 then
    return "Code is valid"
  elseif errorCode > 0 then
    return "Error: Opening bracket(s) missing"
  elseif errorCode < 0 then
    return "Error: Closing bracket(s) missing"
  else
    return "Error: Unknown error"
  end

Вспомнился анекдот:

 

 

Если выпадет орел, идем пить пиво, если решка – идем в кино, а если монета встанет на ребро, то пойдем учиться.
  • Нравится 5
  • Ха-ха 1
  • Грусть 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Чисто технически - там есть четвёртый вариант.
Это когда errorCode содержит не число, а какой-нибудь boolean или вообще nil.

Но в ветку "Unknown error" этот случай всё равно не попадёт, потому что Lua выбросит ошибку на попытке сравнить переменную с нулём.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Чисто технически - там есть четвёртый вариант.

Это когда errorCode содержит не число, а какой-нибудь boolean или вообще nil.

Но в ветку "Unknown error" этот случай всё равно не попадёт, потому что Lua выбросит ошибку на попытке сравнить переменную с нулём.

Разве? Вроде nil трактуется как ложное значение, и результат операций с ним будет всегда ложный, нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Числовые операции (например, операторы <, >, +, *, ...) бросают ошибку, если скормишь им nil.

Изменено пользователем Fingercomp

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

NaN не равен, не больше и не меньше любого числа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все он правильно сделал, гипотетически четвертый вариант возможен:

 

ABxLg5s.png

  • Нравится 1
  • Ха-ха 1
  • Грусть 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Все он правильно сделал, гипотетически четвертый вариант возможен:

 

ABxLg5s.png

Вот, спасибо. Я забыл. nil выкидывает ошибку, я имел в виду NaN.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

inf и nan это уже пятый вариант =)
И с ними - да, проблем не будет.

Проблемы будут если в код ошибки попадёт нечисловой тип, а-ля string.
Но это я уже докапываюсь, исходя из гипотетического предположения, что автор кода решил сделать 100% покрытие всех возможных случаев.

Изменено пользователем Totoro

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть ещё метатаблицы...

 

Но метатаблица в плане типов данных - просто table, разве нет?

Это покрывается четвёртым случаем =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Но метатаблица в плане типов данных - просто table, разве нет?

Это покрывается четвёртым случаем =)

В ней можно поведение при сравнении переопределять.

if setmetatable({value = 4}, {__lt = function(self, other)
      return self.value < other
    end}) < 5 then
  print("It works, unexpectedly.")
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А почему не рекомпилятор в код lua?

Так гораздо быстрее, но есть один минус - большие программы не работают; слишком большой размер блока получается даже со всеми оптимизациями. Я таких уже 3 написал,  первый кривой, второй норм , а третий с поддержкой модов, кучей бесполезных фич и даже с графикой)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, Griffi сказал:

А почему не рекомпилятор в код lua?

Так гораздо быстрее, но есть один минус - большие программы не работают; слишком большой размер блока получается даже со всеми оптимизациями. Я таких уже 3 написал,  первый кривой, второй норм , а третий с поддержкой модов, кучей бесполезных фич и даже с графикой)

О чём этот пост?

Что такое рекомпилятор? Что он делает? Что гораздо быстрее? Что за блоки большого размера? О каких модах идёт речь? И какое отношение ко всему этому имеет графика?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...