diff options
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..5ca07f2 --- /dev/null +++ b/src/main.c @@ -0,0 +1,62 @@ +#include <stdlib.h> +#include <stdio.h> + +#include <lcq/royaljelly/library.h> + +#include <lcq/pit/utils.h> +#include <lcq/pit/lexer.h> +#include <lcq/pit/parser.h> +#include <lcq/pit/runtime.h> +#include <lcq/pit/library.h> + +int main(int argc, char **argv) { + pit_runtime *rt = pit_runtime_new(); + pit_install_library_essential(rt); + pit_install_library_io(rt); + pit_install_library_plist(rt); + pit_install_library_bytestring(rt); + rj_install_library(rt); + if (argc < 2) { /* run repl */ + char buf[1024] = {0}; + i64 len = 0; + pit_runtime_freeze(rt); + if (pit_runtime_print_error(rt)) { exit(1); } + setbuf(stdout, NULL); + printf("> "); + while (len < (i64) sizeof(buf) && (buf[len++] = (char) getchar()) != EOF) { + if (buf[len - 1] == '\n') { + pit_value bs, prog, res; + buf[len - 1] = 0; + bs = pit_bytes_new_cstr(rt, buf); + prog = pit_read_bytes(rt, bs); + res = pit_eval(rt, prog); + if (pit_runtime_print_error(rt)) { + rt->error = PIT_NIL; + printf("> "); + } else { + char dumpbuf[1024] = {0}; + pit_dump(rt, dumpbuf, sizeof(dumpbuf) - 1, res, true); + printf("%s\n> ", dumpbuf); + } + len = 0; + } + } + } else { /* run file */ + pit_value bs = pit_bytes_new_file(rt, argv[1]); + pit_lexer lex; + pit_parser parse; + bool eof = false; + pit_value p = PIT_NIL; + if (!pit_lexer_from_bytes(rt, &lex, bs)) { + pit_error(rt, "failed to initialize lexer"); + } + pit_parser_from_lexer(&parse, &lex); + while (p = pit_parse(rt, &parse, &eof), !eof) { + pit_eval(rt, p); + if (pit_runtime_print_error(rt)) { + exit(1); + } + } + } + return 0; +} |
