AS/400にはC言語の開発環境があるので、これでBrainFuckインタープリタを作ってみます。
BrainFuckについての説明はBrainFuckとはを参照してください。
#include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char mem[256]; int point = 0; int c = 0; char *p; if (argc < 2) return 1; p = argv[1]; memset(mem, 0, sizeof(mem)/sizeof(mem[0])); while (*p) { switch (*p) { case '>': ++point; break; case '<': --point; break; case '+': ++mem[point]; break; case '-': --mem[point]; break; case '.': putchar(mem[point]); break; case ',': mem[point] = getchar(); break; case '[': if (!mem[point]) { c = 0; while (1) { p++; if (*p == '[') c++; if (*p == ']' && c == 0) break; if (*p == ']') c--; } } break; case ']': if (mem[point]) { c = 0; while (1) { p--; if (*p == ']') c++; if (*p == '[' && c == 0) break; if (*p == '[') c--; } } break; } ++p; } return 0; }
ちなみに、BrainFuckスレの189氏のソースをパクって、そのままだと2重ループがうまくいかないから、手直ししただけだったりします。
以下のようなCLから呼び出すと楽かもしれません。
PGM DCL &BFCHAR *CHAR 1000 CHGVAR &BFCHAR VALUE('-[>+.<-]') CALL BF PARM(&BFCHAR) ENDPGM