2012-02-05 4 views
-4

Будет ли кто-нибудь, пожалуйста, описать этот интерпретатор мозгового уха для меня ??Переводчик Brainfuck

#include <stdlib.h> 
    char m[9999], *n[99], *r = m, *p = m + 5000, **s = n, d, c; 
    main() 
    { 
     for (read(0, r, 4000); c = *r; r++) 
       c - ']' || (d > 1 || 
       (r = *p ? *s : (--s, r)), !d || d--), c - '[' || d++ || 
       (*++s = r), d || (*p += c == '+', *p -= c == '-', p += c == '>', 
       p -= c == '<', c - '.' || write(2, p, 1), c - ',' || read(2, p, 1)); 
    } 
+11

Шаг 1 должен состоять в том, чтобы преобразовать его из однострочного трейлера в читаемый фрагмент кода. –

ответ

10

Внутренний цикл использует логическое выражение (короткое замыкание и запятую оператор вместо запятой), чтобы оценить каждый маркер Brainfuck.

Каждый экземпляр <expr a> || <expr b> может быть переведен на if (!<expr a>) { <expr b> }

Каждое использование оператора запятой за пределами (r = *p ? *s : (--s, r)) может быть заменена точкой с запятой.

Список p <op>= <conditional> и *p+= <conditional> может быть заменен на if (<conditional>) p <op>= 1 и if (<conditional>) *p <op>= 1. И вся коллекция в скобках может быть преобразована в if (!d) { ... }.

После того, как вы сделали все, что у вас получилось с помощью довольно простого интерпретатора мозгового укрытия. Просто помните, что оператор запятой как выражение оценивает слева направо.

 Смежные вопросы

  • Нет связанных вопросов^_^