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;
}
|