From 1afd0cdc7820d9c3a9ae032ea40545d7d32bf9bf Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Tue, 5 Jan 2021 22:16:50 +0300 Subject: String type added. --- examples/translator.c | 160 ++++++++++++++++++++++++++------------------------ 1 file changed, 83 insertions(+), 77 deletions(-) (limited to 'examples/translator.c') 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 -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 "); - puts("int main()"); - puts("{"); - printf("csx_run(csx_list(csx_name(\"do\"),"); - readlist(); - puts("0));"); - puts("return 0;"); - puts("}"); + printf("#include \nint main(){csx_run(csx_list(csx_name(\"do\"),"); + items(); + printf("0));return 0;}\n"); return 0; } -- cgit v1.2.3