aboutsummaryrefslogtreecommitdiff
path: root/examples/translator.c
blob: 8358a473a7dc1c7f1fb533f094116871bd0e00b2 (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
#include <ctype.h>
#include <stdlib.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_int(");
            putchar(c);
            c = getchar();
            while (c != EOF && isdigit(c)) {
                putchar(c);
                c = getchar();
            }
            printf(")");
        } else if (isspace(c)) {
            while (isspace(c = getchar()));
        } else if (c == '.') {
            if (getchar() != '[') exit(1);
            if (first) first = 0;
            else putchar(',');
            printf("csx_dot(");
            readlist();
            printf("0)");
            c = getchar();
        } else if (c == '"') {
            if (first) first = 0;
            else putchar(',');
            printf("csx_str(\"");
            while (c != EOF && c != '"') {
                if (c == '\\') c = getchar();
                if (c == '"' || c == '\\') putchar('\\');
                putchar(c);
                c = getchar();
            }
            printf("\")");
        } else if (c == '\'') {
            if (first) first = 0;
            else putchar(',');
            printf("csx_list(csx_name(\"quote\"),");
            c = getchar();
            if (isspace(c)) exit(1);
            else if (c != '[') {
                printf("csx_name(\"");
                while (c != EOF && !isspace(c) && c != '[' && c != ']') {
                    if (c == '"' || c == '\\') putchar('\\');
                    putchar(c);
                    c = getchar();
                }
                printf("\"),");
            } else if (c == '.') {
                if (getchar() != '[') exit(1);
                printf("csx_dot(");
                readlist();
                printf("0)");
                c = getchar();
            } else {
                printf("csx_list(");
                readlist();
                printf("0),");
                c = getchar();
            }
            printf("0)");
        } else {
            if (first) first = 0;
            else putchar(',');
            printf("csx_name(\"");
            while (c != EOF && !isspace(c) && c != '[' && c != ']') {
                if (c == '\\') c = getchar();
                if (c == '"' || c == '\\') putchar('\\');
                putchar(c);
                c = getchar();
            }
            printf("\")");
        }
    }
    if (!first) putchar(',');
}

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