diff options
author | Ian Moffett <ian@osmora.org> | 2025-10-02 19:15:26 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-10-02 19:15:26 -0400 |
commit | bc7dadf4360509b04f4629cebbe345c7899e236b (patch) | |
tree | 712842f13c42c8fb47f27416dc95ac64fed6bfdb | |
parent | 07b352ff545427881c32d6dd8b03539025bbca80 (diff) |
np: codegen: Deprecate AST in favor of stackgen
Deprecate the usage of abstract syntax treats in favor of the much saner
stack machines + IR usage
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r-- | src/sys/include/np/ast.h | 91 | ||||
-rw-r--r-- | src/sys/include/os/np.h | 15 | ||||
-rw-r--r-- | src/sys/np/core/np_parse.c | 51 |
3 files changed, 31 insertions, 126 deletions
diff --git a/src/sys/include/np/ast.h b/src/sys/include/np/ast.h deleted file mode 100644 index 9232226..0000000 --- a/src/sys/include/np/ast.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2025 Ian Marco Moffett and L5 engineers - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef _NP_AST_H_ -#define _NP_AST_H_ 1 - -#include <sys/cdefs.h> -#include <np/lex.h> -#include <os/np.h> -#include <lib/ptrbox.h> -#include <string.h> - -/* - * Valid program integer types - */ -typedef enum { - AST_BAD_TYPE, - AST_U8, - AST_U16, - AST_U32, - AST_U64, - AST_I8, - AST_I16, - AST_I32, - AST_I64 -} ast_itype_t; - -/* - * AST node type - */ -typedef enum { - AT_BAD_OBJTYPE, /* Bad */ - AST_PROC, /* Procedure */ -} ast_type_t; - -/* - * Represents an AST node - * - * @ident: Identifier - * @num_type: Integer type - * @type: Object type - * @left: Left node - * @right: Right node - */ -struct ast_node { - char *ident; - ast_itype_t num_type; - ast_type_t type; - struct ast_node *left; - struct ast_node *right; -}; - -__always_inline static inline void * -ast_alloc(struct np_work *work) -{ - struct ast_node *np; - - np = ptrbox_alloc(sizeof(*np), work->work_mem); - if (np != NULL) { - memset(np, 0, sizeof(*np)); - } - return np; -} - -#endif /* !_NP_AST_H_ */ diff --git a/src/sys/include/os/np.h b/src/sys/include/os/np.h index 6671e10..9dba651 100644 --- a/src/sys/include/os/np.h +++ b/src/sys/include/os/np.h @@ -42,6 +42,21 @@ #include <lib/ptrbox.h> /* + * Valid program integer types + */ +typedef enum { + NP_BAD_TYPE, + NP_U8, + NP_U16, + NP_U32, + NP_U64, + NP_I8, + NP_I16, + NP_I32, + NP_I64 +} np_itype_t; + +/* * Compiler work * * @source: Source input file diff --git a/src/sys/np/core/np_parse.c b/src/sys/np/core/np_parse.c index 3eefde5..4119d8b 100644 --- a/src/sys/np/core/np_parse.c +++ b/src/sys/np/core/np_parse.c @@ -39,7 +39,6 @@ #include <np/lex.h> #include <np/parse.h> #include <np/piir.h> -#include <np/ast.h> #include <os/np.h> #include <lib/ptrbox.h> @@ -143,61 +142,55 @@ parse_expect(struct np_work *work, char *cur, tt_t what, struct lex_token *tok) * @work: Current work * @tok: Token result * - * Returns the ast integer type on success, and AST_BAD_TYPE + * Returns the ast integer type on success, and NP_BAD_TYPE * on failure. */ -static ast_itype_t +static np_itype_t parse_type(struct np_work *work, struct lex_token *tok) { tt_t tt; if (work == NULL || tok == NULL) { - return AST_BAD_TYPE; + return NP_BAD_TYPE; } tt = parse_scan(work, tok); switch (tt) { /* Unsigned types */ - case TT_U8: return AST_U8; - case TT_U16: return AST_U16; - case TT_U32: return AST_U32; - case TT_U64: return AST_U64; + case TT_U8: return NP_U8; + case TT_U16: return NP_U16; + case TT_U32: return NP_U32; + case TT_U64: return NP_U64; /* Signed types */ - case TT_I8: return AST_I8; - case TT_I16: return AST_I16; - case TT_I32: return AST_I32; - case TT_I64: return AST_I64; + case TT_I8: return NP_I8; + case TT_I16: return NP_I16; + case TT_I32: return NP_I32; + case TT_I64: return NP_I64; } - return AST_BAD_TYPE; + return NP_BAD_TYPE; } /* * Parse a procedure / function * * @work: Input work - * @npp: AST node pointer result * @tok: Current token * * Returns zero on success */ static int -parse_proc(struct np_work *work, struct ast_node **npp, struct lex_token *tok) +parse_proc(struct np_work *work, struct lex_token *tok) { char *ident; - struct ast_node *np; - ast_itype_t ret_type = AST_BAD_TYPE; + np_itype_t ret_type = NP_BAD_TYPE; tt_t tt; if (work == NULL || tok == NULL) { return -EINVAL; } - if (npp == NULL) { - return -EINVAL; - } - /* We need the identifier */ tt = parse_expect(work, "proc", TT_IDENT, tok); if (tt == TT_NONE) { @@ -235,7 +228,7 @@ parse_proc(struct np_work *work, struct ast_node **npp, struct lex_token *tok) /* And now the return type */ ret_type = parse_type(work, tok); - if (ret_type == AST_BAD_TYPE) { + if (ret_type == NP_BAD_TYPE) { pr_error( "line %d: expected valid type, got %s\n", work->line_no, @@ -250,18 +243,8 @@ parse_proc(struct np_work *work, struct ast_node **npp, struct lex_token *tok) return -1; } - np = ast_alloc(work); - if (np == NULL) { - pr_error("could not alloc AST node\n"); - return -ENOMEM; - } - ++work->begin_depth; work->in_func = 1; - np->num_type = ret_type; - np->type = AST_PROC; - np->ident = ident; - *npp = np; return 0; } @@ -276,8 +259,6 @@ parse_token(struct np_work *work, struct lex_token *tok) { tt_t tt; int error; - struct ast_node *np; - #define PIIR_PUSH(BYTE) piir_push(work->piir_stack, (BYTE)) /* * XXX: wrapped in "[]" indicates optional @@ -323,7 +304,7 @@ parse_token(struct np_work *work, struct lex_token *tok) return -1; } - if ((error = parse_proc(work, &np, tok)) != 0) { + if ((error = parse_proc(work, tok)) != 0) { return -1; } |