From bdbb94b63785d03d12b2225222ee34108d896668 Mon Sep 17 00:00:00 2001 From: Linnnus Date: Thu, 10 Apr 2025 05:21:21 +0000 Subject: feat(cli): More CLI stuff, idk --- src/core/interpret.c | 19 +++++++++++++++++++ src/core/interpret.h | 20 ++++++++++++++++++++ src/core/state.c | 11 +++++++++++ src/core/state.h | 25 +++++++++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 src/core/interpret.c create mode 100644 src/core/interpret.h create mode 100644 src/core/state.c create mode 100644 src/core/state.h (limited to 'src/core') diff --git a/src/core/interpret.c b/src/core/interpret.c new file mode 100644 index 0000000..bbb238c --- /dev/null +++ b/src/core/interpret.c @@ -0,0 +1,19 @@ +#include "interpret.h" +#include "tokenizer.h" + +#include + +SandInterpretResult sand_interpret(SandState *S, const char *filename, const char *source, size_t source_length) { + SandTokenizer tokenizer = sand_create_tokenizer(source, source_length, filename); + + while (true) { + SandToken token = sand_get_next_token(&tokenizer); + sand_print_location(stdout, &token.location); + printf(": %s \"%.*s\"\n", sand_token_kind_to_string(token.kind), (int)token.content_length, token.content); + if (token.kind == SAND_TOKEN_EOF) { + break; + } + } + + return SAND_INTERPRET_OK; +} diff --git a/src/core/interpret.h b/src/core/interpret.h new file mode 100644 index 0000000..8bdc92f --- /dev/null +++ b/src/core/interpret.h @@ -0,0 +1,20 @@ +#ifndef SAND_INTERPRET_H +#define SAND_INTERPRET_H + +// This module defines a single function which composes all the stuff the +// interpreter does. It should be bascially the only function that an embedder +// needs to know. + +#include "state.h" + +#include + +typedef enum { + SAND_INTERPRET_OK, + SAND_INTERPRET_COMPILE_ERROR, + SAND_INTERPRET_RUNTIME_ERROR, +} SandInterpretResult; + +SandInterpretResult sand_interpret(SandState *, const char *filename, const char *source, size_t source_length); + +#endif diff --git a/src/core/state.c b/src/core/state.c new file mode 100644 index 0000000..91bd9e4 --- /dev/null +++ b/src/core/state.c @@ -0,0 +1,11 @@ +#include "state.h" + +SandState sand_create_state(SandConfig config) { + return (SandState) { + .config = config, + }; +} + +void sand_destroy_state(SandState *S) { + (void) S; +} diff --git a/src/core/state.h b/src/core/state.h new file mode 100644 index 0000000..406a79c --- /dev/null +++ b/src/core/state.h @@ -0,0 +1,25 @@ +#ifndef SAND_STATE_H +#define SAND_STATE_H + +// This module defines the evaluator state. This is the "world" in Sand. +// Multiple evaluator states can coexist as they are totally separate. + +#include + +typedef void (* SandPrintHandler)(const char *message, size_t length); + +typedef struct { + SandPrintHandler print_handler; +} SandConfig; + +// This data structure should be treated as entirely opaque by consuming code. +typedef struct { + SandConfig config; +} SandState; + + +SandState sand_create_state(SandConfig config); + +void sand_destroy_state(SandState *); + +#endif -- cgit v1.2.3