aboutsummaryrefslogtreecommitdiff
path: root/examples/translator.c
blob: ad676c0fc84a1233564703ea1edfd352bcb5d1c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <ctype.h>


void readlist()
{
    int first = 1;
    int c = getchar();
    while (c != EOF && c != ']') {
        if (c == '[') {
            if (first) first = 0;
            else putchar(',');
            printf("csx_list(");
            readlist();
            printf("0)");
            c = getchar();
        } else if (isdigit(c) || c == '-') {
            if (first) first = 0;
            else putchar(',');
            printf("csx_num(");
            putchar(c);
            c = getchar();
            while (c != EOF && isdigit(c)) {
                putchar(c);
                c = getchar();
            }
            printf(")");
        } else if (isspace(c)) {
            while (isspace(c = getchar()));
        } else {
            if (first) first = 0;
            else putchar(',');
            printf("csx_name(\"");
            while (c != EOF && !isspace(c) && c != '[' && c != ']') {
                if (c == '"' || c == '\\') putchar('\\');
                putchar(c);
                c = getchar();
            }
            printf("\")");
        }
    }
    if (!first) putchar(',');
}

int main()
{
    puts("#include <csx.h>");
    puts("int main()");
    puts("{");
    printf("csx_eval(csx_list(csx_name(\"do\"),");
    readlist();
    puts("0));");
    puts("return 0;");
    puts("}");
    return 0;
}