KEMURIコンパイラ

プログラミング言語 KEMURI世界で最初の最適化コンパイラを作りました。

コンパイラのソースと実行

最適化の理屈は、まあ読めばわかるでしょう。
エラー処理はほとんど施していません。クラッシュさせようと思えば、簡単に出来てしまいます。

/* k2c.c */
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(int argc, char *argv[])
{

    printf("#include <stdio.h>\n");
    printf("int main(int argc, char* argv[]) {\n");

    char strage[1024] = {'\0'};
    char c, *t;

    t = strage;

    while (c = getchar(), c != EOF) {
        char *h;
        h = t - 1;

        switch (c) {
        case '`':
            strcpy(t, "!dlrow ,olleH");
            t += 13;
            break;
        case '~':
            *h = ~(*h);
            break;
        case '^':
            *(h - 1) ^= *h;
            *h = '\0';
            t--;
            break;
        case '\"':
            *t = *h;
            t++;
            break;
        case '\'':
            *t = *(t - 1);
            *(t - 1) = *(t - 2);
            *(t - 2) = *(t - 3);
            *(t - 3) = *t;
            *t = '\0';
            break;
        case '|':
            printf("printf(\"");
            while (t != strage && *(--t)) {
                putchar(isprint(*t)? *t: '.');
            };
            printf("\");\n");
            break;
        default:
            break;
        }

    };

    printf("putchar('\\n');\n");
    printf("return 0;");
    printf("}\n");

    return 0;
}
#!/bin/sh
# kc - KEMURI Compiler script

cat $1 | k2c > $1.tmp.c
cc $1.tmp.c

rm -f $1.tmp.c
% cc -o k2c k2c.c
% cat hoge.kmr
`|``|
% kc hoge.kmr
% ./a.out
Hello, world!Hello, world!Hello, world!
%