diff options
Diffstat (limited to 'l/bf.lang')
-rw-r--r-- | l/bf.lang | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/l/bf.lang b/l/bf.lang new file mode 100644 index 0000000..0ce6389 --- /dev/null +++ b/l/bf.lang @@ -0,0 +1,104 @@ +type byte := char; + +func putstr(char[] str) { + int i := 0; + while (str[i] != '\0') { + putc(str[i]); + i = i + 1; + } +} + +func int[] makejumpmap(char[] src, int srclen) { + int[] jm := new int[srclen]; + int[] stack := new int[srclen]; + int stkp := 0; + int i := 0; + while (i < srclen) { + // putint(i); putc(' '); putint(stkp); putc(' '); putc(src[i]); putc('\n'); + if (src[i] == '[') { + stack[stkp] = i; + stkp = stkp + 1; + } + if (src[i] == ']') { + stkp = stkp - 1; + int j := stack[stkp]; + jm[i] = j; + jm[j] = i; + } + i = i + 1; + } + if (stkp != 0) { + putstr("Unmatched opening brackets in BF source\n"); + exit(1); + } + /*i = 0; + while (i < srclen) { + putint(jm[i]); + putc(' '); + i = i + 1; + } + putc('\n');*/ + return jm; +} + +func interpret(char[] src, int srclen) { + int[] jm := makejumpmap(src, srclen); + byte[] mem := new char[4088]; + int ip := 0; + int memp := 0; + while (src[ip] != '\0') { + // putint(ip); putc('\n'); + char c := src[ip]; + if (c == '+') {mem[memp] = mem[memp] + byte(1);} + if (c == '-') {mem[memp] = mem[memp] - byte(1);} + if (c == '>') {memp = memp + 1;} + if (c == '<') {memp = memp - 1;} + if (c == '.') {putc(mem[memp]);} + if (c == ',') {mem[memp] = byte(getc());} + if (c == '[') { + if (mem[memp] == '\0') { + ip = jm[ip]; + } + } + if (c == ']') { + if (mem[memp] != '\0') { + ip = jm[ip]; + } + } + ip = ip + 1; + } + + // debugger; + + putc('\n'); + memp = 0; + while (memp < 10) { + putint(int(mem[memp]) & 0xff); putc(' '); + memp = memp + 1; + } + putc('\n'); +} + +func int main() { + int bufsize := 12280; + char[] source := new char[12280]; + + int sourcelen := 0; + while (1) { + int c := getc(); + // putc(char(c)); + if (c < 0) { + break; + } else { + source[sourcelen] = char(c); + sourcelen = sourcelen + 1; + if (sourcelen >= bufsize - 1) { + break; + } + } + } + source[sourcelen] = '\0'; + + interpret(source, sourcelen); + return 0; +} |