From 38d513c3f844be81b75228d973636b0d8810417f Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 3 Jul 2020 11:02:17 -0500 Subject: [PATCH] Moved the AST nodes to another file --- include/onyxastnodes.h | 254 +++++++++++++++++++++++++++++++++++++++++ include/onyxparser.h | 249 +--------------------------------------- include/onyxsempass.h | 2 +- include/onyxutils.h | 4 +- include/onyxwasm.h | 2 +- onyx | Bin 214304 -> 214480 bytes src/onyxparser.c | 37 +----- src/onyxutils.c | 40 ++++++- 8 files changed, 300 insertions(+), 288 deletions(-) create mode 100644 include/onyxastnodes.h diff --git a/include/onyxastnodes.h b/include/onyxastnodes.h new file mode 100644 index 00000000..a46ef31d --- /dev/null +++ b/include/onyxastnodes.h @@ -0,0 +1,254 @@ +#ifndef ONYXASTNODES_H +#define ONYXASTNODES_H + +#include "onyxlex.h" + +typedef struct AstNode AstNode; +typedef struct AstNodeTyped AstNodeTyped; +typedef struct AstNodeUnaryOp AstNodeUnaryOp; +typedef struct AstNodeBinOp AstNodeBinOp; +typedef struct AstNodeAssign AstNodeAssign; +typedef struct AstNodeNumLit AstNodeNumLit; +typedef struct AstNodeLocal AstNodeLocal; +typedef struct AstNodeScope AstNodeScope; +typedef struct AstNodeReturn AstNodeReturn; +typedef struct AstNodeBlock AstNodeBlock; +typedef struct AstNodeIf AstNodeIf; +typedef struct AstNodeWhile AstNodeWhile; +typedef struct AstNodeFunction AstNodeFunction; +typedef struct AstNodeForeign AstNodeForeign; +typedef struct AstNodeGlobal AstNodeGlobal; +typedef struct AstNodeCall AstNodeCall; +typedef struct AstNodeArgument AstNodeArgument; +typedef struct AstNodeUse AstNodeUse; + +typedef enum AstNodeKind { + AST_NODE_KIND_ERROR, + AST_NODE_KIND_PROGRAM, + AST_NODE_KIND_USE, + + AST_NODE_KIND_FUNCTION, + AST_NODE_KIND_FOREIGN, + AST_NODE_KIND_BLOCK, + AST_NODE_KIND_SCOPE, + AST_NODE_KIND_LOCAL, + AST_NODE_KIND_GLOBAL, + AST_NODE_KIND_SYMBOL, + + AST_NODE_KIND_UNARY_OP, + AST_NODE_KIND_BIN_OP, + + AST_NODE_KIND_TYPE, + AST_NODE_KIND_LITERAL, + AST_NODE_KIND_PARAM, + AST_NODE_KIND_ARGUMENT, + AST_NODE_KIND_CALL, + AST_NODE_KIND_ASSIGNMENT, + AST_NODE_KIND_RETURN, + + AST_NODE_KIND_IF, + AST_NODE_KIND_WHILE, + AST_NODE_KIND_BREAK, + AST_NODE_KIND_CONTINUE, + + AST_NODE_KIND_COUNT +} AstNodeKind; + +typedef enum TypeInfoKind { + TYPE_INFO_KIND_UNKNOWN, + TYPE_INFO_KIND_VOID, + TYPE_INFO_KIND_BOOL, + + TYPE_INFO_KIND_UINT32, + TYPE_INFO_KIND_UINT64, + + TYPE_INFO_KIND_INT32, + TYPE_INFO_KIND_INT64, + + TYPE_INFO_KIND_FLOAT32, + TYPE_INFO_KIND_FLOAT64, + TYPE_INFO_KIND_SOFT_FLOAT, // 64-bits of data but could be treated as 32-bit +} TypeInfoKind; + +typedef struct TypeInfo { + TypeInfoKind kind; + u32 size; // in bytes + const char* name; + u32 is_int : 1; + u32 is_unsigned : 1; + u32 is_float : 1; + u32 is_bool : 1; + u32 is_known : 1; +} TypeInfo; + +extern TypeInfo builtin_types[]; + +// NOTE: Some of these flags will overlap since there are +// only 32-bits of flags to play with +typedef enum OnyxAstFlags { + // Top-level flags + ONYX_AST_FLAG_EXPORTED = BH_BIT(0), + ONYX_AST_FLAG_LVAL = BH_BIT(1), + ONYX_AST_FLAG_CONST = BH_BIT(2), + ONYX_AST_FLAG_COMPTIME = BH_BIT(3), +} OnyxAstFlags; + +typedef enum OnyxUnaryOp { + ONYX_UNARY_OP_NEGATE, + ONYX_UNARY_OP_NOT, + ONYX_UNARY_OP_CAST, +} OnyxUnaryOp; + +typedef enum OnyxBinaryOp { + ONYX_BINARY_OP_ADD = 0, + ONYX_BINARY_OP_MINUS = 1, + ONYX_BINARY_OP_MULTIPLY = 2, + ONYX_BINARY_OP_DIVIDE = 3, + ONYX_BINARY_OP_MODULUS = 4, + + ONYX_BINARY_OP_EQUAL = 5, + ONYX_BINARY_OP_NOT_EQUAL = 6, + ONYX_BINARY_OP_LESS = 7, + ONYX_BINARY_OP_LESS_EQUAL = 8, + ONYX_BINARY_OP_GREATER = 9, + ONYX_BINARY_OP_GREATER_EQUAL = 10, +} OnyxBinaryOp; + +// NOTE: AstNode and AstNodeTyped need to be EXACTLY the same for +// all arguments existing in AstNode. I do this to avoid a nested +// "inheiritance" where you would have to say node.base.base.next +// for example +struct AstNode { + AstNodeKind kind; + u32 flags; + OnyxToken *token; + AstNode *next; +}; + +struct AstNodeTyped { + AstNodeKind kind; + u32 flags; + OnyxToken *token; + AstNode *next; + TypeInfo *type; +}; + +struct AstNodeBinOp { + AstNodeTyped base; + + OnyxBinaryOp operation; + + AstNodeTyped *left, *right; +}; + +struct AstNodeUnaryOp { + AstNodeTyped base; + + OnyxUnaryOp operation; + + AstNodeTyped *expr; +}; + +struct AstNodeAssign { + AstNode base; + + AstNodeTyped* lval; + AstNodeTyped* expr; +}; + +struct AstNodeNumLit { + AstNodeTyped base; + + union { i32 i; i64 l; f32 f; f64 d; } value; +}; + +struct AstNodeLocal { + AstNodeTyped base; + + AstNodeLocal *prev_local; +}; + +struct AstNodeReturn { + AstNode base; + + AstNodeTyped* expr; +}; + +struct AstNodeScope { + AstNode base; + + AstNodeScope *prev_scope; + AstNodeLocal *last_local; +}; + +struct AstNodeBlock { + AstNode base; + + AstNode *body; + AstNodeScope *scope; +}; + +struct AstNodeIf { + AstNode base; + + AstNodeTyped *cond; + AstNode *true_block; + AstNode *false_block; +}; + +struct AstNodeWhile { + AstNode base; + + AstNodeTyped *cond; + AstNodeBlock *body; +}; + +struct AstNodeFunction { + AstNodeTyped base; + + AstNodeBlock *body; + AstNodeLocal *params; +}; + +struct AstNodeForeign { + AstNode base; + + OnyxToken *mod_token, *name_token; + AstNode *import; +}; + +struct AstNodeGlobal { + AstNodeTyped base; + + AstNodeTyped *initial_value; +}; + +struct AstNodeCall { + AstNodeTyped base; + + AstNode *callee; // NOTE: Function definition node + AstNodeArgument *arguments; // NOTE: Expressions that form the actual param list + // They will be chained down using the "next" property + // unless this becomes used by something else +}; + +struct AstNodeArgument { + AstNodeTyped base; + + AstNodeTyped *value; +}; + +struct AstNodeUse { + AstNode base; + + OnyxToken *filename; +}; + +typedef struct OnyxProgram { + bh_arr(AstNodeUse *) uses; + bh_arr(AstNodeGlobal *) globals; + bh_arr(AstNodeFunction *) functions; + bh_arr(AstNodeForeign *) foreigns; +} OnyxProgram; + +#endif // #ifndef ONYXASTNODES_H diff --git a/include/onyxparser.h b/include/onyxparser.h index 095797a4..76886e14 100644 --- a/include/onyxparser.h +++ b/include/onyxparser.h @@ -5,25 +5,7 @@ #include "onyxlex.h" #include "onyxmsgs.h" - -typedef struct AstNode AstNode; -typedef struct AstNodeTyped AstNodeTyped; -typedef struct AstNodeUnaryOp AstNodeUnaryOp; -typedef struct AstNodeBinOp AstNodeBinOp; -typedef struct AstNodeAssign AstNodeAssign; -typedef struct AstNodeNumLit AstNodeNumLit; -typedef struct AstNodeLocal AstNodeLocal; -typedef struct AstNodeScope AstNodeScope; -typedef struct AstNodeReturn AstNodeReturn; -typedef struct AstNodeBlock AstNodeBlock; -typedef struct AstNodeIf AstNodeIf; -typedef struct AstNodeWhile AstNodeWhile; -typedef struct AstNodeFunction AstNodeFunction; -typedef struct AstNodeForeign AstNodeForeign; -typedef struct AstNodeGlobal AstNodeGlobal; -typedef struct AstNodeCall AstNodeCall; -typedef struct AstNodeArgument AstNodeArgument; -typedef struct AstNodeUse AstNodeUse; +#include "onyxastnodes.h" typedef struct OnyxParser { OnyxTokenizer *tokenizer; // NOTE: not used since all tokens are lexed before parsing starts @@ -38,235 +20,6 @@ typedef struct OnyxParser { bh_allocator allocator; } OnyxParser; -typedef enum AstNodeKind { - AST_NODE_KIND_ERROR, - AST_NODE_KIND_PROGRAM, - AST_NODE_KIND_USE, - - AST_NODE_KIND_FUNCTION, - AST_NODE_KIND_FOREIGN, - AST_NODE_KIND_BLOCK, - AST_NODE_KIND_SCOPE, - AST_NODE_KIND_LOCAL, - AST_NODE_KIND_GLOBAL, - AST_NODE_KIND_SYMBOL, - - AST_NODE_KIND_UNARY_OP, - AST_NODE_KIND_BIN_OP, - - AST_NODE_KIND_TYPE, - AST_NODE_KIND_LITERAL, - AST_NODE_KIND_PARAM, - AST_NODE_KIND_ARGUMENT, - AST_NODE_KIND_CALL, - AST_NODE_KIND_ASSIGNMENT, - AST_NODE_KIND_RETURN, - - AST_NODE_KIND_IF, - AST_NODE_KIND_WHILE, - AST_NODE_KIND_BREAK, - AST_NODE_KIND_CONTINUE, - - AST_NODE_KIND_COUNT -} AstNodeKind; - -typedef enum TypeInfoKind { - TYPE_INFO_KIND_UNKNOWN, - TYPE_INFO_KIND_VOID, - TYPE_INFO_KIND_BOOL, - - TYPE_INFO_KIND_UINT32, - TYPE_INFO_KIND_UINT64, - - TYPE_INFO_KIND_INT32, - TYPE_INFO_KIND_INT64, - - TYPE_INFO_KIND_FLOAT32, - TYPE_INFO_KIND_FLOAT64, - TYPE_INFO_KIND_SOFT_FLOAT, // 64-bits of data but could be treated as 32-bit -} TypeInfoKind; - -typedef struct TypeInfo { - TypeInfoKind kind; - u32 size; // in bytes - const char* name; - u32 is_int : 1; - u32 is_unsigned : 1; - u32 is_float : 1; - u32 is_bool : 1; - u32 is_known : 1; -} TypeInfo; - -extern TypeInfo builtin_types[]; - -// NOTE: Some of these flags will overlap since there are -// only 32-bits of flags to play with -typedef enum OnyxAstFlags { - // Top-level flags - ONYX_AST_FLAG_EXPORTED = BH_BIT(0), - ONYX_AST_FLAG_LVAL = BH_BIT(1), - ONYX_AST_FLAG_CONST = BH_BIT(2), - ONYX_AST_FLAG_COMPTIME = BH_BIT(3), -} OnyxAstFlags; - -typedef enum OnyxUnaryOp { - ONYX_UNARY_OP_NEGATE, - ONYX_UNARY_OP_NOT, - ONYX_UNARY_OP_CAST, -} OnyxUnaryOp; - -typedef enum OnyxBinaryOp { - ONYX_BINARY_OP_ADD = 0, - ONYX_BINARY_OP_MINUS = 1, - ONYX_BINARY_OP_MULTIPLY = 2, - ONYX_BINARY_OP_DIVIDE = 3, - ONYX_BINARY_OP_MODULUS = 4, - - ONYX_BINARY_OP_EQUAL = 5, - ONYX_BINARY_OP_NOT_EQUAL = 6, - ONYX_BINARY_OP_LESS = 7, - ONYX_BINARY_OP_LESS_EQUAL = 8, - ONYX_BINARY_OP_GREATER = 9, - ONYX_BINARY_OP_GREATER_EQUAL = 10, -} OnyxBinaryOp; - -// NOTE: AstNode and AstNodeTyped need to be EXACTLY the same for -// all arguments existing in AstNode. I do this to avoid a nested -// "inheiritance" where you would have to say node.base.base.next -// for example -struct AstNode { - AstNodeKind kind; - u32 flags; - OnyxToken *token; - AstNode *next; -}; - -struct AstNodeTyped { - AstNodeKind kind; - u32 flags; - OnyxToken *token; - AstNode *next; - TypeInfo *type; -}; - -struct AstNodeBinOp { - AstNodeTyped base; - - OnyxBinaryOp operation; - - AstNodeTyped *left, *right; -}; - -struct AstNodeUnaryOp { - AstNodeTyped base; - - OnyxUnaryOp operation; - - AstNodeTyped *expr; -}; - -struct AstNodeAssign { - AstNode base; - - AstNodeTyped* lval; - AstNodeTyped* expr; -}; - -struct AstNodeNumLit { - AstNodeTyped base; - - union { i32 i; i64 l; f32 f; f64 d; } value; -}; - -struct AstNodeLocal { - AstNodeTyped base; - - AstNodeLocal *prev_local; -}; - -struct AstNodeReturn { - AstNode base; - - AstNodeTyped* expr; -}; - -struct AstNodeScope { - AstNode base; - - AstNodeScope *prev_scope; - AstNodeLocal *last_local; -}; - -struct AstNodeBlock { - AstNode base; - - AstNode *body; - AstNodeScope *scope; -}; - -struct AstNodeIf { - AstNode base; - - AstNodeTyped *cond; - AstNode *true_block; - AstNode *false_block; -}; - -struct AstNodeWhile { - AstNode base; - - AstNodeTyped *cond; - AstNodeBlock *body; -}; - -struct AstNodeFunction { - AstNodeTyped base; - - AstNodeBlock *body; - AstNodeLocal *params; -}; - -struct AstNodeForeign { - AstNode base; - - OnyxToken *mod_token, *name_token; - AstNode *import; -}; - -struct AstNodeGlobal { - AstNodeTyped base; - - AstNodeTyped *initial_value; -}; - -struct AstNodeCall { - AstNodeTyped base; - - AstNode *callee; // NOTE: Function definition node - AstNodeArgument *arguments; // NOTE: Expressions that form the actual param list - // They will be chained down using the "next" property - // unless this becomes used by something else -}; - -struct AstNodeArgument { - AstNodeTyped base; - - AstNodeTyped *value; -}; - -struct AstNodeUse { - AstNode base; - - OnyxToken *filename; -}; - -typedef struct OnyxProgram { - bh_arr(AstNodeUse *) uses; - bh_arr(AstNodeGlobal *) globals; - bh_arr(AstNodeFunction *) functions; - bh_arr(AstNodeForeign *) foreigns; -} OnyxProgram; - const char* onyx_ast_node_kind_string(AstNodeKind kind); void* onyx_ast_node_new(bh_allocator alloc, i32 size, AstNodeKind kind); OnyxParser onyx_parser_create(bh_allocator alloc, OnyxTokenizer *tokenizer, OnyxMessages* msgs); diff --git a/include/onyxsempass.h b/include/onyxsempass.h index 2e4b1d22..a2bb7918 100644 --- a/include/onyxsempass.h +++ b/include/onyxsempass.h @@ -4,7 +4,7 @@ #include "bh.h" #include "onyxlex.h" -#include "onyxparser.h" +#include "onyxastnodes.h" #include "onyxmsgs.h" typedef struct SemPassSymbol { diff --git a/include/onyxutils.h b/include/onyxutils.h index fa325d8c..86cac2fa 100644 --- a/include/onyxutils.h +++ b/include/onyxutils.h @@ -1,6 +1,6 @@ #include "bh.h" -#include "onyxparser.h" +#include "onyxastnodes.h" extern bh_scratch global_scratch; extern bh_allocator global_scratch_allocator; @@ -8,4 +8,6 @@ extern bh_allocator global_scratch_allocator; extern bh_managed_heap global_heap; extern bh_allocator global_heap_allocator; +const char* onyx_ast_node_kind_string(AstNodeKind kind); + void onyx_ast_print(AstNode* program, i32 indent); diff --git a/include/onyxwasm.h b/include/onyxwasm.h index 1e6dcb90..8ac9bf07 100644 --- a/include/onyxwasm.h +++ b/include/onyxwasm.h @@ -3,7 +3,7 @@ #include "bh.h" -#include "onyxparser.h" +#include "onyxastnodes.h" #include "onyxmsgs.h" typedef u8 WasmType; diff --git a/onyx b/onyx index abdad2c4ba9abd7c3ccf0dd5ed8f9802ae32b027..1ca270bf0e65bfd757b6bcdca4221f22e6bbfb74 100755 GIT binary patch delta 49437 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 SIC)b?qT}Ld=DoE>?*9W^8TJSO diff --git a/src/onyxparser.c b/src/onyxparser.c index 55d84acb..0d203444 100644 --- a/src/onyxparser.c +++ b/src/onyxparser.c @@ -6,38 +6,6 @@ // NOTE: The one weird define you need to know before read the code below #define make_node(nclass, kind) onyx_ast_node_new(parser->allocator, sizeof(nclass), kind) -static const char* ast_node_names[] = { - "ERROR", - "PROGRAM", - "USE", - - "FUNCTION", - "FOREIGN", - "BLOCK", - "SCOPE", - "LOCAL", - "GLOBAL", - "SYMBOL", - - "UN_OP", - "BIN_OP", - - "TYPE", - "LITERAL", - "PARAM", - "ARGUMENT", - "CALL", - "ASSIGN", - "RETURN", - - "IF", - "WHILE", - "BREAK", - "CONTINUE", - - "AST_NODE_KIND_COUNT", -}; - struct TypeInfo builtin_types[] = { { TYPE_INFO_KIND_UNKNOWN, 0, "unknown" }, { TYPE_INFO_KIND_VOID, 0, "void", 0, 0, 0, 0, 1 }, @@ -526,6 +494,7 @@ static b32 parse_symbol_statement(OnyxParser* parser, AstNode** ret) { AstNodeAssign* assign_node = make_node(AstNodeAssign, AST_NODE_KIND_ASSIGNMENT); + // TODO: Maybe I don't need to make another lval node? AstNode* lval = make_node(AstNode, AST_NODE_KIND_SYMBOL); lval->token = symbol; assign_node->lval = (AstNodeTyped *) lval; @@ -885,10 +854,6 @@ static AstNode* parse_top_level_statement(OnyxParser* parser) { -const char* onyx_ast_node_kind_string(AstNodeKind kind) { - return ast_node_names[kind]; -} - // NOTE: This returns a void* so I don't need to cast it everytime I use it void* onyx_ast_node_new(bh_allocator alloc, i32 size, AstNodeKind kind) { void* node = bh_alloc(alloc, size); diff --git a/src/onyxutils.c b/src/onyxutils.c index b5537cb4..53c2f0ff 100644 --- a/src/onyxutils.c +++ b/src/onyxutils.c @@ -1,6 +1,6 @@ #include "onyxutils.h" #include "onyxlex.h" -#include "onyxparser.h" +#include "onyxastnodes.h" bh_scratch global_scratch; bh_allocator global_scratch_allocator; @@ -8,6 +8,44 @@ bh_allocator global_scratch_allocator; bh_managed_heap global_heap; bh_allocator global_heap_allocator; +static const char* ast_node_names[] = { + "ERROR", + "PROGRAM", + "USE", + + "FUNCTION", + "FOREIGN", + "BLOCK", + "SCOPE", + "LOCAL", + "GLOBAL", + "SYMBOL", + + "UN_OP", + "BIN_OP", + + "TYPE", + "LITERAL", + "PARAM", + "ARGUMENT", + "CALL", + "ASSIGN", + "RETURN", + + "IF", + "WHILE", + "BREAK", + "CONTINUE", + + "AST_NODE_KIND_COUNT", +}; + +const char* onyx_ast_node_kind_string(AstNodeKind kind) { + return ast_node_names[kind]; +} + + + #define print_indent { if (indent > 0) bh_printf("\n"); for (int i = 0; i < indent; i++) bh_printf(" "); } void onyx_ast_print(AstNode* node, i32 indent) { -- 2.25.1