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