From 9075e91263f6cd74d33d0e078ba9ab77a95f1083 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 10 Sep 2026 21:10:18 +0000 Subject: Work in progress changes for the module system. I am only committing to save my work somewhere, but it doesn't work yet. FossilOrigin-Name: 45400ea0e451183f360a3d0cbb14f262cbec2e62167bad732fd396ed0ce4acaf --- src/lib/aplwc_internal.h | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) (limited to 'src/lib/aplwc_internal.h') diff --git a/src/lib/aplwc_internal.h b/src/lib/aplwc_internal.h index d97cbf7..0bdd5b5 100644 --- a/src/lib/aplwc_internal.h +++ b/src/lib/aplwc_internal.h @@ -27,10 +27,22 @@ #include #include +typedef int symbol_t; + +enum keyword { + KW_MODULE, + KW_SYMBOL, + KW_EXPORT, + + N_KWDS +}; + struct aplwc { struct aplwc_fns fns; enum aplwc_rc last_error; struct aplwc_module *modules; + struct symbol *symtab; + symbol_t keyword_symbols[N_KWDS]; /* Memory management */ uint8_t *data; @@ -79,6 +91,10 @@ struct token { enum token_tag tag; size_t start; size_t end; + union { + symbol_t symbol; + enum keyword keyword; + } data; }; struct token_list { @@ -99,9 +115,25 @@ struct aplwc_value { struct aplwc_module { struct string *name; struct token_list *tokens; + struct module_member *imports; + struct module_member *members; struct aplwc_module *link; }; +struct module_member { + int exported; + struct aplwc_module *module; + symbol_t name; + struct module_member *real_member; /* a symbol points to its identifier member. An imported symbol points to the defining member */ + struct module_member *link; +}; + +struct symbol { + symbol_t id; + struct string *text; + struct symbol *link; +}; + /* eval.c */ struct aplwc_value *eval_line(struct aplwc *, struct aplwc_line *); @@ -113,7 +145,8 @@ struct string *memory_alloc_string(struct aplwc *, size_t); struct token_list *memory_alloc_token_list(struct aplwc *, size_t); struct aplwc_value *memory_alloc_aplwc_value(struct aplwc *); struct aplwc_module *memory_alloc_aplwc_module(struct aplwc *); -struct module_imports *memory_alloc_module_imports(struct aplwc *, size_t); +struct module_member *memory_alloc_module_member(struct aplwc *); +struct symbol *memory_alloc_symbol(struct aplwc *); void memory_root_new(struct aplwc *, void *, struct aplwc_ref *); void *memory_root_get(struct aplwc_ref *); void memory_root_free(struct aplwc_ref *); @@ -134,10 +167,15 @@ struct string *chars_to_string(struct aplwc *, const char *, int len); uint32_t string_char(struct string *, size_t); size_t char_length(struct string *, size_t); int string_compare(struct string *, struct string *); +struct string *substring(struct aplwc *, struct string *, size_t, size_t); /* syntax.c */ struct token_list *scan_string(struct aplwc *, struct string *, int); -enum aplwc_rc check_tokens(struct token_list *); +enum aplwc_rc check_tokens(struct aplwc_module *, struct token_list *); +enum aplwc_rc keyword_init(struct aplwc *); + +/* symtab.c */ +enum aplwc_rc getsym(struct aplwc *, struct string *, symbol_t *); /* module.c */ enum aplwc_rc load_module(struct aplwc *, struct string *, struct token_list *); -- cgit v1.2.3