Browse Source

restart vm on parse error

master
Martin Dørum 3 years ago
parent
commit
b7baa90a9d
1 changed files with 12 additions and 5 deletions
  1. 12
    5
      cmd/main.c

+ 12
- 5
cmd/main.c View File

char line[4096]; char line[4096];
#ifdef USE_READLINE #ifdef USE_READLINE
char *rline = readline("> "); char *rline = readline("> ");
if (rline == NULL) return;
if (rline == NULL) goto out;
if (rline[0] == '\0') continue; if (rline[0] == '\0') continue;
add_history(rline); add_history(rline);
snprintf(line, sizeof(line), "print (%s)", rline); snprintf(line, sizeof(line), "print (%s)", rline);
free(rline); free(rline);
#else #else
char rline[4096]; char rline[4096];
if (fgets(rline, sizeof(rline), stdin) == NULL) return;
if (fgets(rline, sizeof(rline), stdin) == NULL) goto out;
if (rline[0] == '\n' && rline[1] == '\0') continue; if (rline[0] == '\n' && rline[1] == '\0') continue;
snprintf(line, sizeof(line), "print (%s)", rline); snprintf(line, sizeof(line), "print (%s)", rline);
#endif #endif
r.mem = line; r.mem = line;
l2_lexer_init(&lexer, &r.r); l2_lexer_init(&lexer, &r.r);


size_t prev_len = w.len;

struct l2_parse_error err; struct l2_parse_error err;
if (l2_parse_program(&lexer, &gen, &err) < 0) { if (l2_parse_program(&lexer, &gen, &err) < 0) {
fprintf(stderr, "Parse error: %s\n -- %s\n", err.message, line); fprintf(stderr, "Parse error: %s\n -- %s\n", err.message, line);
l2_parse_error_free(&err); l2_parse_error_free(&err);
w.len = prev_len;

l2_vm_free(&vm);
l2_gen_free(&gen);
w.len = 0;
l2_gen_init(&gen, &w.w);
l2_vm_init(&vm, NULL, 0);
} else if (w.len > 0) { } else if (w.len > 0) {
vm.ops = w.mem; vm.ops = w.mem;
vm.opcount = w.len / sizeof(l2_word); vm.opcount = w.len / sizeof(l2_word);
l2_vm_gc(&vm); l2_vm_gc(&vm);
} }
} }

out:
l2_gen_free(&gen);
l2_vm_free(&vm);
} }


static void usage(const char *argv0) { static void usage(const char *argv0) {

Loading…
Cancel
Save