Перейти к публикации
Форум - ComputerCraft
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() внутри себя
-- Поэтому не надо проверять код на валидность самостоятельно 

 

 

  • Like 6

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


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

Надо теперь расширить до 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

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

 

 

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

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


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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

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

  • Like 3

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


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

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

 

ABxLg5s.png

  • Like 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
  • Like 3

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


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

Создайте аккаунт или войдите в него для комментирования

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

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×