From b41590525efd951eef8fbd00d849be107fdcd08a Mon Sep 17 00:00:00 2001 From: Allen Webster Date: Fri, 1 Oct 2021 20:42:14 -0700 Subject: [PATCH] [expr parser] fuse operator with operator node --- bin/build_tests.sh | 5 +++- source/md.c | 70 ++++++++++++++++++++++++---------------------- source/md.h | 13 ++------- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/bin/build_tests.sh b/bin/build_tests.sh index 65d48be..161afd3 100755 --- a/bin/build_tests.sh +++ b/bin/build_tests.sh @@ -9,10 +9,13 @@ cd .. echo "~~~ Build All Tests ~~~" bin/bld_core.sh show_ctx +bin/bld_core.sh unit expression_tests tests/expression_tests.c + +exit + bin/bld_core.sh unit sanity_tests tests/sanity_tests.c bin/bld_core.sh unit unicode_test tests/unicode_test.c bin/bld_core.sh unit cpp_build_test tests/cpp_build_test.cpp -bin/bld_core.sh unit expression_tests tests/expression_tests.c echo diff --git a/source/md.c b/source/md.c index 0c2b935..2b72e14 100644 --- a/source/md.c +++ b/source/md.c @@ -3316,14 +3316,14 @@ MD_ExprOprPush(MD_Arena *arena, MD_ExprOprList *list, MD_ExprOprKind kind, MD_u64 precedence, MD_String8 string, MD_u32 op_id, void *op_ptr) { - MD_ExprOprNode *node = MD_PushArrayZero(arena, MD_ExprOprNode, 1); - MD_QueuePush(list->first, list->last, node); + MD_ExprOpr *op = MD_PushArrayZero(arena, MD_ExprOpr, 1); + MD_QueuePush(list->first, list->last, op); list->count += 1; - node->op.op_id = op_id; - node->op.kind = kind; - node->op.precedence = precedence; - node->op.string = string; - node->op.op_ptr = op_ptr; + op->op_id = op_id; + op->kind = kind; + op->precedence = precedence; + op->string = string; + op->op_ptr = op_ptr; } MD_FUNCTION MD_ExprOprTable @@ -3331,35 +3331,35 @@ MD_ExprBakeOperatorTableFromList(MD_Arena *arena, MD_ExprOprList *list) { MD_ExprOprTable result = MD_ZERO_STRUCT; - for(MD_ExprOprNode *op_node = list->first; - op_node != 0; - op_node = op_node->next) + for(MD_ExprOpr *op = list->first; + op != 0; + op = op->next) { - MD_ExprOpr op = op_node->op; - MD_String8 op_s = op.string; + MD_ExprOprKind op_kind = op->kind; + MD_String8 op_s = op->string; // TODO(allen): @upgrade_potential(minor) // error checking MD_String8 error_str = MD_ZERO_STRUCT; - if(op.kind != MD_ExprOprKind_Prefix && op.kind != MD_ExprOprKind_Postfix && - op.kind != MD_ExprOprKind_Binary && op.kind != MD_ExprOprKind_BinaryRightAssociative) + if(op_kind != MD_ExprOprKind_Prefix && op_kind != MD_ExprOprKind_Postfix && + op_kind != MD_ExprOprKind_Binary && op_kind != MD_ExprOprKind_BinaryRightAssociative) { error_str = MD_S8Fmt(arena, "Invalid operator kind."); } else { - for(MD_ExprOprNode *op_node2 = list->first; - op_node2 != op_node; - op_node2 = op_node2->next) + for(MD_ExprOpr *op2 = list->first; + op2 != op; + op2 = op2->next) { // NOTE(mal): O(n^2) - MD_ExprOpr op2 = op_node2->op; - MD_String8 op2_s = op2.string; - if(op.precedence == op2.precedence && - ((op.kind == MD_ExprOprKind_Binary && - op2.kind == MD_ExprOprKind_BinaryRightAssociative) || - (op.kind == MD_ExprOprKind_BinaryRightAssociative && - op2.kind == MD_ExprOprKind_Binary))) + MD_ExprOprKind op2_kind = op2->kind; + MD_String8 op2_s = op2->string; + if(op->precedence == op2->precedence && + ((op_kind == MD_ExprOprKind_Binary && + op2_kind == MD_ExprOprKind_BinaryRightAssociative) || + (op_kind == MD_ExprOprKind_BinaryRightAssociative && + op2_kind == MD_ExprOprKind_Binary))) { error_str = MD_S8Fmt(arena, "Ignored binary operator \"%.*s\" because another binary operator" @@ -3367,11 +3367,11 @@ MD_ExprBakeOperatorTableFromList(MD_Arena *arena, MD_ExprOprList *list) } else if(MD_S8Match(op_s, op2_s, 0)) { - if(op.kind == op2.kind) + if(op_kind == op2_kind) { error_str = MD_S8Fmt(arena, "Ignored repeat operator \"%.*s\".", MD_S8VArg(op_s)); } - else if(op.kind != MD_ExprOprKind_Prefix && op2.kind != MD_ExprOprKind_Prefix) + else if(op_kind != MD_ExprOprKind_Prefix && op2_kind != MD_ExprOprKind_Prefix) { error_str = MD_S8Fmt(arena, "Ignored conflicting repeat operator \"%.*s\". There can't be" @@ -3394,11 +3394,11 @@ MD_ExprBakeOperatorTableFromList(MD_Arena *arena, MD_ExprOprList *list) // save list else { - MD_ExprOprList *list = result.table + op.kind; - MD_ExprOprNode *op_node_copy = MD_PushArrayZero(arena, MD_ExprOprNode, 1); + MD_ExprOprList *list = result.table + op_kind; + MD_ExprOpr *op_node_copy = MD_PushArray(arena, MD_ExprOpr, 1); + *op_node_copy = *op; MD_QueuePush(list->first, list->last, op_node_copy); list->count += 1; - op_node_copy->op = op; } } @@ -3643,21 +3643,25 @@ MD_ExprOprFromKindString(MD_ExprOprTable *table, MD_ExprOprKind kind, MD_String8 // NOTE(mal): Look for operator on one or all (kind == MD_ExprOprKind_Null) tables MD_ExprOpr *result = 0; for(MD_ExprOprKind cur_kind = (MD_ExprOprKind)(MD_ExprOprKind_Null + 1); - !result && cur_kind < MD_ExprOprKind_COUNT; + cur_kind < MD_ExprOprKind_COUNT; cur_kind = (MD_ExprOprKind)(cur_kind + 1)) { if(kind == MD_ExprOprKind_Null || kind == cur_kind) { MD_ExprOprList *op_list = table->table+cur_kind; - for(MD_ExprOprNode *op_node = op_list->first; !result && op_node; op_node = op_node->next) + for(MD_ExprOpr *op = op_list->first; + op != 0; + op = op->next) { - if(MD_S8Match(op_node->op.string, s, 0)) + if(MD_S8Match(op->string, s, 0)) { - result = &op_node->op; + result = op; + goto dbl_break; } } } } + dbl_break:; return result; } diff --git a/source/md.h b/source/md.h index 480ddef..3a5128b 100644 --- a/source/md.h +++ b/source/md.h @@ -728,10 +728,10 @@ typedef enum MD_ExprOprKind MD_ExprOprKind_COUNT, } MD_ExprOprKind; -// TODO(allen): can we lego-brick the node and opr? typedef struct MD_ExprOpr MD_ExprOpr; struct MD_ExprOpr { + struct MD_ExprOpr *next; MD_u32 op_id; MD_ExprOprKind kind; MD_u32 precedence; @@ -739,18 +739,11 @@ struct MD_ExprOpr void *op_ptr; }; -typedef struct MD_ExprOprNode MD_ExprOprNode; -struct MD_ExprOprNode -{ - struct MD_ExprOprNode *next; - MD_ExprOpr op; -}; - typedef struct MD_ExprOprList MD_ExprOprList; struct MD_ExprOprList { - MD_ExprOprNode *first; - MD_ExprOprNode *last; + MD_ExprOpr *first; + MD_ExprOpr *last; MD_u64 count; };