aboutsummaryrefslogtreecommitdiff
path: root/examples/translator.c
diff options
context:
space:
mode:
authorAleksey Veresov <aleksey@veresov.pro>2021-01-05 22:16:50 +0300
committerAleksey Veresov <aleksey@veresov.pro>2021-01-05 22:16:50 +0300
commit1afd0cdc7820d9c3a9ae032ea40545d7d32bf9bf (patch)
tree949ee5d2423088fcda8fc958e31e36f8de727d92 /examples/translator.c
parent5d7eed48337ff1f9a30118f5d8be67c641bbfcf8 (diff)
downloadcsx-1afd0cdc7820d9c3a9ae032ea40545d7d32bf9bf.tar
csx-1afd0cdc7820d9c3a9ae032ea40545d7d32bf9bf.tar.xz
csx-1afd0cdc7820d9c3a9ae032ea40545d7d32bf9bf.zip
String type added.
Diffstat (limited to 'examples/translator.c')
-rw-r--r--examples/translator.c160
1 files changed, 83 insertions, 77 deletions
diff --git a/examples/translator.c b/examples/translator.c
index 29f4d4e..01920c9 100644
--- a/examples/translator.c
+++ b/examples/translator.c
@@ -3,42 +3,83 @@
#include <stdlib.h>
-void readlist()
+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)
+{
+ printf("csx_int(");
+ if (a) putchar(a);
+ c = getchar();
+ while (c != EOF && isdigit(c)) {
+ putchar(c);
+ c = getchar();
+ }
+ printf(")");
+}
+
+void pair()
+{
+ if ((c = getchar()) == '[') {
+ printf("csx_pair(");
+ items();
+ printf("0)");
+ c = getchar();
+ } else name('=');
+}
+
+void list()
+{
+ printf("csx_list(");
+ items();
+ printf("0)");
+ c = getchar();
+}
+
+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;
- int c = getchar();
+ c = getchar();
+ skip();
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(',');
+ if (first) first = 0; else putchar(',');
+ if (c == '[') list();
+ else if (c == '-')
+ if (isdigit(c = getchar())) num('-');
+ else name('-');
+ else if (isdigit(c)) num(c);
+ else if (c == '=') pair();
+ else if (c == '"') {
printf("csx_str(\"");
c = getchar();
while (c != EOF && c != '"') {
@@ -50,57 +91,22 @@ void readlist()
printf("\")");
c = getchar();
} 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 (c == '[') list();
+ else if (c == '=') pair();
+ else name(0);
+ printf(",0)");
+ } else name(0);
+ skip();
}
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("}");
+ printf("#include <csx.h>\nint main(){csx_run(csx_list(csx_name(\"do\"),");
+ items();
+ printf("0));return 0;}\n");
return 0;
}