aboutsummaryrefslogtreecommitdiff
path: root/examples/translator.c
blob: 26bd5acda766ab2e7e4ce17c5bd2edde1ed05b58 (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>


int c;


void items();

void name(char a)
{
    printf("csx_name(\"");
    if (a) putchar(a);
    while (c != EOF && !isspace(c) && c != '[' && c != ']') {
        if (c == '"' || c == '\\') putchar('\\');
        putchar(c);
        c = getchar();
    }
    printf("\")");
}

void num(char a, char b)
{
    printf("csx_int(");
    if (a) putchar(a);
    if (b) putchar(b);
    c = getchar();
    while (c != EOF && isdigit(c)) {
        putchar(c);
        c = getchar();
    }
    printf(")");
}

void list()
{
    printf("csx_list(");
    items();
    printf("0)");
    c = getchar();
}

void pair()
{
    if ((c = getchar()) == '[') {
        printf("csx_pair(");
        items();
        printf("0)");
        c = getchar();
    } else name('=');
}

void quote()
{
    printf("csx_list(csx_name(\"quote\"),");
    c = getchar();
    if (c == '[') list();
    else if (c == '=') pair();
    else if (c == '\'') quote();
    else name(0);
    printf(",0)");
}

void skip()
{
    while (isspace(c) || c == '{') {
        if (isspace(c)) while (isspace(c = getchar()));
        if (c == '{') {
            int level = 1;
            while (level && c != EOF) {
                while ((c = getchar()) != '{' && c != '}' && c != EOF);
                if (c == '{') ++level;
                if (c == '}') --level;
            }
            if (c != EOF) c = getchar();
        }
    }
}

void items()
{
    int first = 1;
    c = getchar();
    skip();
    while (c != EOF && c != ']') {
        if (first) first = 0; else putchar(',');
        if (c == '[') list();
        else if (c == '-')
            if (isdigit(c = getchar())) num('-', c);
            else name('-');
        else if (isdigit(c)) num(c, 0);
        else if (c == '=') pair();
        else if (c == '"') {
            printf("csx_str(\"");
            c = getchar();
            while (c != EOF && c != '"') {
                if (c == '\\') c = getchar();
                if (c == '"' || c == '\\') putchar('\\');
                putchar(c);
                c = getchar();
            }
            printf("\")");
            c = getchar();
        } else if (c == '\'') quote();
        else name(0);
        skip();
    }
    if (!first) putchar(',');
}

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