-2

誰かが私のためにこの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));
    }
4

1 に答える 1

13

内側のループは、短絡ブール式(およびセミコロンの代わりにコンマ演算子)を使用して、各brainfuckトークンを評価します。

の各インスタンスは次の<expr a> || <expr b>ように変換できますif (!<expr a>) { <expr b> }

の外側でコンマ演算子を使用するたび(r = *p ? *s : (--s, r))に、セミコロンに置き換えることができます。

およびのリストは、p <op>= <conditional>および*p+= <conditional>に置き換えることができます。そして、その括弧で囲まれたコレクション全体をに変換することができます。if (<conditional>) p <op>= 1if (<conditional>) *p <op>= 1if (!d) { ... }

すべてを実行すると、非常に単純なbrainfuckインタープリターになります。式としてのコンマ演算子は左から右に評価されることを覚えておいてください。

于 2012-02-05T07:06:33.900 に答える