mirror of
https://github.com/Ed94/metadesk.git
synced 2026-07-28 10:20:02 +00:00
[expr parser] a few misc bits of tidying - poking around for next steps - notes on issues
This commit is contained in:
+81
-64
@@ -3361,6 +3361,8 @@ MD_ExprBakeOperatorTableFromList(MD_Arena *arena, MD_ExprOprList *list)
|
||||
{
|
||||
MD_ExprOprTable result = MD_ZERO_STRUCT;
|
||||
|
||||
// TODO(allen): @upgrade_potential(minor)
|
||||
|
||||
for(MD_ExprOpr *op = list->first;
|
||||
op != 0;
|
||||
op = op->next)
|
||||
@@ -3368,8 +3370,6 @@ MD_ExprBakeOperatorTableFromList(MD_Arena *arena, MD_ExprOprList *list)
|
||||
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 &&
|
||||
@@ -3439,6 +3439,8 @@ MD_ExprBakeOperatorTableFromList(MD_Arena *arena, MD_ExprOprList *list)
|
||||
MD_FUNCTION MD_ExprOpr*
|
||||
MD_ExprOprFromKindString(MD_ExprOprTable *table, MD_ExprOprKind kind, MD_String8 s)
|
||||
{
|
||||
// TODO(allen): @upgrade_potential
|
||||
|
||||
// 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);
|
||||
@@ -3464,39 +3466,6 @@ MD_ExprOprFromKindString(MD_ExprOprTable *table, MD_ExprOprKind kind, MD_String8
|
||||
return result;
|
||||
}
|
||||
|
||||
MD_FUNCTION MD_Expr*
|
||||
MD_Expr_Alloc(MD_Arena *arena, MD_ExprOpr *op, MD_Node *op_node,
|
||||
MD_Expr *left, MD_Expr *right)
|
||||
{
|
||||
MD_Expr *result = MD_PushArrayZero(arena, MD_Expr, 1);
|
||||
result->is_op = 1;
|
||||
result->op_id = op->op_id;
|
||||
result->op_ptr = op->op_ptr;
|
||||
result->md_node = op_node;
|
||||
result->left = left;
|
||||
result->right = right;
|
||||
result->left->parent = result;
|
||||
if(result->right)
|
||||
{ // TODO(mal): Introduce Nil expr node?
|
||||
result->right->parent = result;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
MD_FUNCTION MD_ExprParseCtx
|
||||
MD_ExprParse_MakeContext(MD_ExprOprTable *op_table)
|
||||
{
|
||||
MD_ExprParseCtx result = MD_ZERO_STRUCT;
|
||||
result.op_table = op_table;
|
||||
|
||||
result.accel.bracket_set_op = MD_ExprOprFromKindString(op_table, MD_ExprOprKind_Prefix, MD_S8Lit("[]"));
|
||||
result.accel.brace_set_op = MD_ExprOprFromKindString(op_table, MD_ExprOprKind_Prefix, MD_S8Lit("{}"));
|
||||
result.accel.call_op = MD_ExprOprFromKindString(op_table, MD_ExprOprKind_Postfix, MD_S8Lit("()"));
|
||||
result.accel.subscript_op = MD_ExprOprFromKindString(op_table, MD_ExprOprKind_Binary, MD_S8Lit("[]"));
|
||||
|
||||
return(result);
|
||||
}
|
||||
|
||||
MD_FUNCTION MD_ExprParseResult
|
||||
MD_ExprParse(MD_Arena *arena, MD_ExprOprTable *op_table, MD_Node *first, MD_Node *opl)
|
||||
{
|
||||
@@ -3513,6 +3482,52 @@ MD_ExprParse(MD_Arena *arena, MD_ExprOprTable *op_table, MD_Node *first, MD_Node
|
||||
return(result);
|
||||
}
|
||||
|
||||
MD_FUNCTION MD_Expr*
|
||||
MD_Expr_NewLeaf(MD_Arena *arena, MD_Node *node)
|
||||
{
|
||||
MD_Expr *result = MD_PushArrayZero(arena, MD_Expr, 1);
|
||||
result->md_node = node;
|
||||
return(result);
|
||||
}
|
||||
|
||||
MD_FUNCTION MD_Expr*
|
||||
MD_Expr_NewOp(MD_Arena *arena, MD_ExprOpr *op, MD_Node *op_node, MD_Expr *l, MD_Expr *r)
|
||||
{
|
||||
MD_Expr *result = MD_PushArrayZero(arena, MD_Expr, 1);
|
||||
result->is_op = 1;
|
||||
result->op_id = op->op_id;
|
||||
result->op_ptr = op->op_ptr;
|
||||
result->md_node = op_node;
|
||||
result->parent = 0;
|
||||
result->left = l;
|
||||
result->right = r;
|
||||
if (l != 0)
|
||||
{
|
||||
MD_Assert(l->parent == 0);
|
||||
l->parent = result;
|
||||
}
|
||||
if(r != 0)
|
||||
{
|
||||
MD_Assert(r->parent == 0);
|
||||
r->parent = result;
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
MD_FUNCTION MD_ExprParseCtx
|
||||
MD_ExprParse_MakeContext(MD_ExprOprTable *op_table)
|
||||
{
|
||||
MD_ExprParseCtx result = MD_ZERO_STRUCT;
|
||||
result.op_table = op_table;
|
||||
|
||||
result.accel.bracket_set_op = MD_ExprOprFromKindString(op_table, MD_ExprOprKind_Prefix, MD_S8Lit("[]"));
|
||||
result.accel.brace_set_op = MD_ExprOprFromKindString(op_table, MD_ExprOprKind_Prefix, MD_S8Lit("{}"));
|
||||
result.accel.call_op = MD_ExprOprFromKindString(op_table, MD_ExprOprKind_Postfix, MD_S8Lit("()"));
|
||||
result.accel.subscript_op = MD_ExprOprFromKindString(op_table, MD_ExprOprKind_Binary, MD_S8Lit("[]"));
|
||||
|
||||
return(result);
|
||||
}
|
||||
|
||||
MD_FUNCTION MD_Expr*
|
||||
MD_ExprParse_TopLevel(MD_Arena *arena, MD_ExprParseCtx *ctx, MD_Node *first, MD_Node *opl)
|
||||
{
|
||||
@@ -3589,6 +3604,8 @@ MD_ExprParse_Atom(MD_Arena *arena, MD_ExprParseCtx *ctx, MD_Node **iter,
|
||||
*iter = MD_NodeNextWithLimit(*iter, opl);
|
||||
result = MD_ExprParse_TopLevel(arena, ctx, node->first_child, MD_NilNode());
|
||||
}
|
||||
// TODO(allen): this part seems a bit odd. I think any (delimited) set
|
||||
// should get this treatment, without making these operators to enable them.
|
||||
else if(((node->flags & MD_NodeFlag_HasBracketLeft) && (node->flags & MD_NodeFlag_HasBracketRight) &&
|
||||
ctx->accel.bracket_set_op) ||
|
||||
((node->flags & MD_NodeFlag_HasBraceLeft) &&
|
||||
@@ -3597,8 +3614,7 @@ MD_ExprParse_Atom(MD_Arena *arena, MD_ExprParseCtx *ctx, MD_Node **iter,
|
||||
{
|
||||
*iter = MD_NodeNextWithLimit(*iter, opl);
|
||||
// NOTE(mal): Unparsed leaf sets ({ ... }, [ ... ])
|
||||
result = MD_PushArrayZero(arena, MD_Expr, 1);
|
||||
result->md_node = node;
|
||||
result = MD_Expr_NewLeaf(arena, node);
|
||||
}
|
||||
else if(MD_ExprParse_OprConsume(ctx, iter, opl, MD_ExprOprKind_Prefix, 1, &op))
|
||||
{
|
||||
@@ -3607,7 +3623,7 @@ MD_ExprParse_Atom(MD_Arena *arena, MD_ExprParseCtx *ctx, MD_Node **iter,
|
||||
MD_ExprParse_MinPrecedence(arena, ctx, iter, first, opl, min_precedence);
|
||||
if(ctx->errors.max_message_kind == MD_MessageKind_Null)
|
||||
{
|
||||
result = MD_Expr_Alloc(arena, op, node, sub_expr, 0);
|
||||
result = MD_Expr_NewOp(arena, op, node, sub_expr, 0);
|
||||
}
|
||||
}
|
||||
else if(MD_ExprParse_OprConsume(ctx, iter, opl, MD_ExprOprKind_Null, 1, &op))
|
||||
@@ -3627,8 +3643,7 @@ MD_ExprParse_Atom(MD_Arena *arena, MD_ExprParseCtx *ctx, MD_Node **iter,
|
||||
}
|
||||
else{ // NOTE(mal): leaf
|
||||
*iter = MD_NodeNextWithLimit(*iter, opl);
|
||||
result = MD_PushArrayZero(arena, MD_Expr, 1);
|
||||
result->md_node = node;
|
||||
result = MD_Expr_NewLeaf(arena, node);
|
||||
}
|
||||
|
||||
return(result);
|
||||
@@ -3652,48 +3667,50 @@ MD_ExprParse_MinPrecedence(MD_Arena *arena, MD_ExprParseCtx *ctx,
|
||||
MD_Node *node = *iter;
|
||||
MD_ExprOpr *op = 0;
|
||||
|
||||
if(subscript_op != 0 && subscript_op->precedence >= min_precedence &&
|
||||
(node->flags & MD_NodeFlag_HasBracketLeft) &&
|
||||
(node->flags & MD_NodeFlag_HasBracketRight))
|
||||
{
|
||||
*iter = MD_NodeNextWithLimit(*iter, opl);
|
||||
|
||||
// NOTE(mal): Array subscript
|
||||
MD_Expr* sub_expr = MD_ExprParse_TopLevel(arena, ctx, node->first_child, MD_NilNode());
|
||||
if(ctx->errors.max_message_kind == MD_MessageKind_Null)
|
||||
{
|
||||
result = MD_Expr_Alloc(arena, subscript_op, node, result, sub_expr);
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if(MD_ExprParse_OprConsume(ctx, iter, opl, MD_ExprOprKind_Binary,
|
||||
min_precedence, &op) ||
|
||||
MD_ExprParse_OprConsume(ctx, iter, opl, MD_ExprOprKind_BinaryRightAssociative,
|
||||
min_precedence, &op))
|
||||
if(MD_ExprParse_OprConsume(ctx, iter, opl, MD_ExprOprKind_Binary,
|
||||
min_precedence, &op) ||
|
||||
MD_ExprParse_OprConsume(ctx, iter, opl, MD_ExprOprKind_BinaryRightAssociative,
|
||||
min_precedence, &op))
|
||||
{
|
||||
MD_u32 next_min_precedence = op->precedence + (op->kind == MD_ExprOprKind_Binary);
|
||||
MD_Expr *sub_expr =
|
||||
MD_ExprParse_MinPrecedence(arena, ctx, iter, first, opl, next_min_precedence);
|
||||
if(ctx->errors.max_message_kind == MD_MessageKind_Null)
|
||||
{
|
||||
result = MD_Expr_Alloc(arena, op, node, result, sub_expr);
|
||||
result = MD_Expr_NewOp(arena, op, node, result, sub_expr);
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
else if(subscript_op != 0 && subscript_op->precedence >= min_precedence &&
|
||||
(node->flags & MD_NodeFlag_HasBracketLeft) &&
|
||||
(node->flags & MD_NodeFlag_HasBracketRight))
|
||||
{
|
||||
*iter = MD_NodeNextWithLimit(*iter, opl);
|
||||
// NOTE(mal): Array subscript
|
||||
MD_Expr* sub_expr = MD_ExprParse_TopLevel(arena, ctx, node->first_child, MD_NilNode());
|
||||
if(ctx->errors.max_message_kind == MD_MessageKind_Null)
|
||||
{
|
||||
result = MD_Expr_NewOp(arena, subscript_op, node, result, sub_expr);
|
||||
}
|
||||
else{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
else if(ctx->accel.call_op && ctx->accel.call_op->precedence >= min_precedence &&
|
||||
node->flags & MD_NodeFlag_HasParenLeft && node->flags & MD_NodeFlag_HasParenRight)
|
||||
(node->flags & MD_NodeFlag_HasParenLeft) &&
|
||||
(node->flags & MD_NodeFlag_HasParenRight))
|
||||
{ // NOTE: call
|
||||
*iter = MD_NodeNextWithLimit(*iter, opl);
|
||||
result = MD_Expr_Alloc(arena, ctx->accel.call_op, node, result, 0);
|
||||
result = MD_Expr_NewOp(arena, ctx->accel.call_op, node, result, 0);
|
||||
}
|
||||
else if(MD_ExprParse_OprConsume(ctx, iter, opl, MD_ExprOprKind_Postfix,
|
||||
min_precedence, &op))
|
||||
{
|
||||
result = MD_Expr_Alloc(arena, op, node, result, 0);
|
||||
result = MD_Expr_NewOp(arena, op, node, result, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+2
-1
@@ -1122,7 +1122,8 @@ MD_FUNCTION MD_ExprOpr* MD_ExprOprFromKindString(MD_ExprOprTable *table,
|
||||
MD_FUNCTION MD_ExprParseResult MD_ExprParse(MD_Arena *arena, MD_ExprOprTable *op_table,
|
||||
MD_Node *first, MD_Node *one_past_last);
|
||||
|
||||
MD_FUNCTION MD_Expr* MD_Expr_Alloc(MD_Arena *arena, MD_ExprOpr *op, MD_Node *op_node,
|
||||
MD_FUNCTION MD_Expr* MD_Expr_NewLeaf(MD_Arena *arena, MD_Node *node);
|
||||
MD_FUNCTION MD_Expr* MD_Expr_NewOp(MD_Arena *arena, MD_ExprOpr *op, MD_Node *op_node,
|
||||
MD_Expr *left, MD_Expr *right);
|
||||
|
||||
MD_FUNCTION MD_ExprParseCtx MD_ExprParse_MakeContext(MD_ExprOprTable *table);
|
||||
|
||||
Reference in New Issue
Block a user