diff --git a/forth_interp.c b/forth_interp.c index 564c08f..7614c74 100644 --- a/forth_interp.c +++ b/forth_interp.c @@ -58,4 +58,40 @@ void process_token(const char* token) { } else { // Not a known word: try to parse as number char* end; long v = strtol(token, &end, 10); - if \ No newline at end of file + if (end != token && *end == '\0') { // Valid integer + if (state == 0) { // Interpret mode: push number + data_push((int32_t)v); + } else { // Compile mode: compile lit + number + Word* lit_w = lookup_word_internal("lit"); + if (lit_w == NULL) { + printf("Fatal: lit word not found\n"); + return; + } + if (compile_idx + 2 > COMPILE_BUF_SIZE) { + printf("Compile buffer full\n"); + return; + } + compile_buf[compile_idx++] = (Cell){.word = lit_w}; + compile_buf[compile_idx++] = (Cell){.num = (int32_t)v}; + } + } else { + printf("Unknown word: '%s'\n", token); + } + } +} + +void outer_interpreter(void) { + while (1) { + printf("ok "); + fflush(stdout); + if (fgets(input_buf, INPUT_BUF_SIZE, stdin) == NULL) { + break; // EOF + } + input_ptr = input_buf; + char* tok; + while ((tok = next_token()) != NULL) { + process_token(tok); + } + } + printf("\n"); +}