2012-02-05 1 views
-4

누군가이 두뇌 통역사를 나에게 설명해 주시겠습니까 ??Brainfuck Interpreter

#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

내부 루프는 각 두뇌 토큰을 평가하기 위해 단락 논리식 (그리고 세미콜론 대신 쉼표 연산자)을 사용합니다.

<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>= 1으로 바꿀 수 있습니다. 그 전체 괄호 안의 컬렉션은 if (!d) { ... }으로 변형 될 수 있습니다.

일단 모든 작업을 완료하면 꽤 간단한 두뇌 통역사가됩니다. 쉼표 연산자가 왼쪽에서 오른쪽으로 평가되는 식으로 기억하십시오.

관련 문제