Move all ExprKind metadata into a single table

This commit is contained in:
ryanfleury
2021-01-22 14:03:16 -07:00
parent 7e62679ef6
commit 1a2a47e88d
2 changed files with 123 additions and 100 deletions
+4 -7
View File
@@ -500,12 +500,7 @@ struct MD_ParseResult
typedef enum MD_ExprKind
{
// VERY_IMPORTANT_NOTE(rjf): If this enum is ever changed, ensure that
// it is kept in-sync with the MD_ExprPrecFromExprKind and the following
// functions:
//
// MD_BinaryExprKindFromNode
// MD_PreUnaryExprKindFromNode
// MD_PostUnaryExprKindFromNode
// it is kept in-sync with the _MD_MetadataFromExprKind function.
MD_ExprKind_Nil,
@@ -757,11 +752,13 @@ MD_FUNCTION MD_b32 MD_ExprDeepMatch(MD_Expr *a, MD_Expr *b, MD_StringMatc
//~ Generation
MD_FUNCTION void MD_OutputTree(FILE *file, MD_Node *node);
MD_FUNCTION void MD_OutputExpr(FILE *file, MD_Expr *expr);
MD_FUNCTION void MD_OutputTree_C_String(FILE *file, MD_Node *node);
MD_FUNCTION void MD_OutputTree_C_Struct(FILE *file, MD_Node *node);
MD_FUNCTION void MD_OutputTree_C_Decl(FILE *file, MD_Node *node);
MD_FUNCTION void MD_Output_C_DeclByNameAndType(FILE *file, MD_String8 name, MD_Expr *type);
MD_FUNCTION void MD_OutputExpr(FILE *file, MD_Expr *expr);
MD_FUNCTION void MD_OutputExpr_C(FILE *file, MD_Expr *expr);
MD_FUNCTION void MD_OutputType(FILE *file, MD_Expr *expr);
MD_FUNCTION void MD_OutputType_C_LHS(FILE *file, MD_Expr *type);
MD_FUNCTION void MD_OutputType_C_RHS(FILE *file, MD_Expr *type);
+119 -93
View File
@@ -531,7 +531,7 @@ MD_StyledStringFromString(MD_String8 string, MD_WordStyle word_style, MD_String8
MD_b32 making_word = 0;
MD_String8 word = {0};
for(MD_u64 i = 0; i < string.size;)
for(MD_u64 i = 0; i < string.size;)
{
if(making_word)
{
@@ -1979,11 +1979,85 @@ MD_ExprIsNil(MD_Expr *expr)
return expr == 0 || expr == &_md_nil_expr || expr->kind == MD_ExprKind_Nil;
}
typedef enum _MD_ExprKindGroup
{
_MD_ExprKindGroup_Nil,
_MD_ExprKindGroup_Atom,
_MD_ExprKindGroup_Binary,
_MD_ExprKindGroup_PreUnary,
_MD_ExprKindGroup_PostUnary,
_MD_ExprKindGroup_Type,
}
_MD_ExprKindGroup;
typedef struct _MD_ExprKindMetadata _MD_ExprKindMetadata;
struct _MD_ExprKindMetadata
{
_MD_ExprKindGroup group;
MD_ExprPrec prec;
char *symbol;
char *pre_symbol;
char *post_symbol;
};
MD_FUNCTION_IMPL _MD_ExprKindMetadata *
_MD_MetadataFromExprKind(MD_ExprKind kind)
{
// 0: Invalid
// 12: (unary) - ~ !
// 11: . -> () []
// 10: * / %
// 9: + -
// 8: << >>
// 7: < <= > >=
// 6: == !=
// 5: (bitwise) &
// 4: ^
// 3: |
// 2: &&
// 1: ||
static _MD_ExprKindMetadata metadata[] =
{
{_MD_ExprKindGroup_Nil, +0, "NIL", "", "" }, // MD_ExprKind_Nil
{_MD_ExprKindGroup_Atom, +0, "NIL", "", "" }, // MD_ExprKind_Atom
{_MD_ExprKindGroup_Binary, +11, ".", "", "" }, // MD_ExprKind_Dot
{_MD_ExprKindGroup_Binary, +11, "->", "", "" }, // MD_ExprKind_Arrow
{_MD_ExprKindGroup_PostUnary, +11, "", "(", ")"}, // MD_ExprKind_Call
{_MD_ExprKindGroup_PostUnary, +11, "", "[", "]"}, // MD_ExprKind_Subscript
{_MD_ExprKindGroup_PreUnary, +12, "", "*", "" }, // MD_ExprKind_Dereference
{_MD_ExprKindGroup_PreUnary, +12, "", "&", "" }, // MD_ExprKind_Reference
{_MD_ExprKindGroup_Binary, +9, "+", "", "" }, // MD_ExprKind_Add
{_MD_ExprKindGroup_Binary, +9, "-", "", "" }, // MD_ExprKind_Subtract
{_MD_ExprKindGroup_Binary, +10, "*", "", "" }, // MD_ExprKind_Multiply
{_MD_ExprKindGroup_Binary, +10, "/", "", "" }, // MD_ExprKind_Divide
{_MD_ExprKindGroup_Binary, +10, "%", "", "" }, // MD_ExprKind_Mod
{_MD_ExprKindGroup_Binary, +6, "==", "", "" }, // MD_ExprKind_IsEqual
{_MD_ExprKindGroup_Binary, +6, "!=", "", "" }, // MD_ExprKind_IsNotEqual
{_MD_ExprKindGroup_Binary, +7, "<", "", "" }, // MD_ExprKind_LessThan
{_MD_ExprKindGroup_Binary, +7, ">", "", "" }, // MD_ExprKind_GreaterThan
{_MD_ExprKindGroup_Binary, +7, "<=", "", "" }, // MD_ExprKind_LessThanEqualTo
{_MD_ExprKindGroup_Binary, +7, ">=", "", "" }, // MD_ExprKind_GreaterThanEqualTo
{_MD_ExprKindGroup_Binary, +2, "&&", "", "" }, // MD_ExprKind_BoolAnd
{_MD_ExprKindGroup_Binary, +1, "||", "", "" }, // MD_ExprKind_BoolOr
{_MD_ExprKindGroup_PreUnary, +12, "", "!", "" }, // MD_ExprKind_BoolNot
{_MD_ExprKindGroup_Binary, +5, "&", "", "" }, // MD_ExprKind_BitAnd
{_MD_ExprKindGroup_Binary, +3, "|", "", "" }, // MD_ExprKind_BitOr
{_MD_ExprKindGroup_PreUnary, +12, "", "~", "" }, // MD_ExprKind_BitNot
{_MD_ExprKindGroup_Binary, +4, "^", "", "" }, // MD_ExprKind_BitXor
{_MD_ExprKindGroup_Binary, +8, "<<", "", "" }, // MD_ExprKind_LeftShift
{_MD_ExprKindGroup_Binary, +8, ">>", "", "" }, // MD_ExprKind_RightShift
{_MD_ExprKindGroup_PreUnary, +12, "", "-", "" }, // MD_ExprKind_Negative
{_MD_ExprKindGroup_Type, +0, "*", "", "" }, // MD_ExprKind_Pointer
{_MD_ExprKindGroup_Type, +0, "", "[", "]"}, // MD_ExprKind_Array
};
return &metadata[kind];
}
MD_FUNCTION_IMPL MD_ExprKind
MD_PreUnaryExprKindFromNode(MD_Node *node)
{
MD_ExprKind kind = MD_ExprKind_Nil;
#define MD_ExprStr(str, _kind) if(MD_StringMatch(node->string, MD_S8Lit(str), 0)) {kind = _kind; goto end;}
// NOTE(rjf): Special-cases for calls/subscripts.
if(!MD_NodeIsNil(node->first_child))
{
if(node->flags & MD_NodeFlag_ParenLeft &&
@@ -1999,14 +2073,20 @@ MD_PreUnaryExprKindFromNode(MD_Node *node)
}
else
{
MD_ExprStr("-", MD_ExprKind_Negative);
MD_ExprStr("~", MD_ExprKind_BitNot);
MD_ExprStr("!", MD_ExprKind_BoolNot);
MD_ExprStr("*", MD_ExprKind_Dereference);
MD_ExprStr("&", MD_ExprKind_Reference);
for(MD_ExprKind kind_it = (MD_ExprKind)0; kind_it < MD_ExprKind_MAX;
kind_it = (MD_ExprKind)((int)kind_it + 1))
{
_MD_ExprKindMetadata *metadata = _MD_MetadataFromExprKind(kind_it);
if(metadata->group == _MD_ExprKindGroup_PreUnary)
{
if(MD_StringMatch(node->string, MD_S8CString(metadata->pre_symbol), 0))
{
kind = kind_it;
break;
}
}
}
}
end:;
#undef MD_ExprStr
return kind;
}
@@ -2034,92 +2114,30 @@ MD_FUNCTION_IMPL MD_ExprKind
MD_BinaryExprKindFromNode(MD_Node *node)
{
MD_ExprKind kind = MD_ExprKind_Nil;
#define MD_ExprStr(str, _kind) if(MD_StringMatch(node->string, MD_S8Lit(str), 0)) {kind = _kind; goto end;}
if(node->kind == MD_NodeKind_Label && MD_NodeIsNil(node->first_child))
{
MD_ExprStr(".", MD_ExprKind_Dot);
MD_ExprStr("->", MD_ExprKind_Arrow);
MD_ExprStr("+", MD_ExprKind_Add);
MD_ExprStr("-", MD_ExprKind_Subtract);
MD_ExprStr("*", MD_ExprKind_Multiply);
MD_ExprStr("/", MD_ExprKind_Divide);
MD_ExprStr("%", MD_ExprKind_Mod);
MD_ExprStr("==", MD_ExprKind_IsEqual);
MD_ExprStr("!=", MD_ExprKind_IsNotEqual);
MD_ExprStr("<", MD_ExprKind_LessThan);
MD_ExprStr(">", MD_ExprKind_GreaterThan);
MD_ExprStr("<=", MD_ExprKind_LessThanEqualTo);
MD_ExprStr(">=", MD_ExprKind_GreaterThanEqualTo);
MD_ExprStr("&&", MD_ExprKind_BoolAnd);
MD_ExprStr("||", MD_ExprKind_BoolOr);
MD_ExprStr("!", MD_ExprKind_BoolNot);
MD_ExprStr("&", MD_ExprKind_BitAnd);
MD_ExprStr("|", MD_ExprKind_BitOr);
MD_ExprStr("^", MD_ExprKind_BitXor);
MD_ExprStr("<<", MD_ExprKind_LeftShift);
MD_ExprStr(">>", MD_ExprKind_RightShift);
for(MD_ExprKind kind_it = (MD_ExprKind)0; kind_it < MD_ExprKind_MAX;
kind_it = (MD_ExprKind)((int)kind_it + 1))
{
_MD_ExprKindMetadata *metadata = _MD_MetadataFromExprKind(kind_it);
if(metadata->group == _MD_ExprKindGroup_Binary)
{
if(MD_StringMatch(node->string, MD_S8CString(metadata->symbol), 0))
{
kind = kind_it;
break;
}
}
}
}
end:;
#undef MD_ExprStr
return kind;
}
MD_FUNCTION_IMPL MD_ExprPrec
MD_ExprPrecFromExprKind(MD_ExprKind kind)
{
// 0: Invalid
// 12: (unary) - ~ !
// 11: . -> () []
// 10: * / %
// 9: + -
// 8: << >>
// 7: < <= > >=
// 6: == !=
// 5: (bitwise) &
// 4: ^
// 3: |
// 2: &&
// 1: ||
MD_ExprPrec kind_to_prec[] =
{
+0, // MD_ExprKind_Nil
+0, // MD_ExprKind_Atom
+11, // MD_ExprKind_Dot
+11, // MD_ExprKind_Arrow
+11, // MD_ExprKind_Call
+11, // MD_ExprKind_Subscript
+12, // MD_ExprKind_Dereference
+12, // MD_ExprKind_Reference
+9, // MD_ExprKind_Add
+9, // MD_ExprKind_Subtract
+10, // MD_ExprKind_Multiply
+10, // MD_ExprKind_Divide
+10, // MD_ExprKind_Mod
+6, // MD_ExprKind_IsEqual
+6, // MD_ExprKind_IsNotEqual
+7, // MD_ExprKind_LessThan
+7, // MD_ExprKind_GreaterThan
+7, // MD_ExprKind_LessThanEqualTo
+7, // MD_ExprKind_GreaterThanEqualTo
+2, // MD_ExprKind_BoolAnd
+1, // MD_ExprKind_BoolOr
+12, // MD_ExprKind_BoolNot
+5, // MD_ExprKind_BitAnd
+3, // MD_ExprKind_BitOr
+12, // MD_ExprKind_BitNot
+4, // MD_ExprKind_BitXor
+8, // MD_ExprKind_LeftShift
+8, // MD_ExprKind_RightShift
+12, // MD_ExprKind_Negative
+0, // MD_ExprKind_Pointer
+0, // MD_ExprKind_Array
};
return kind_to_prec[kind];
_MD_ExprKindMetadata *metadata = _MD_MetadataFromExprKind(kind);
return metadata->prec;
}
MD_FUNCTION_IMPL MD_Expr *
@@ -2475,12 +2493,6 @@ MD_OutputTree(FILE *file, MD_Node *node)
}
}
MD_FUNCTION_IMPL void
MD_OutputExpr(FILE *file, MD_Expr *expr)
{
}
MD_FUNCTION_IMPL void
MD_OutputTree_C_String(FILE *file, MD_Node *node)
{
@@ -2522,7 +2534,6 @@ MD_OutputTree_C_Decl(FILE *file, MD_Node *node)
{
if(node)
{
// TODO(allen): MD_ParseAsType?
MD_Expr *type = MD_ParseAsType(node->first_child, node->last_child);
MD_Output_C_DeclByNameAndType(file, node->string, type);
}
@@ -2536,6 +2547,21 @@ MD_Output_C_DeclByNameAndType(FILE *file, MD_String8 name, MD_Expr *type)
MD_OutputType_C_RHS(file, type);
}
MD_FUNCTION_IMPL void
MD_OutputExpr(FILE *file, MD_Expr *expr)
{
if(!MD_NodeIsNil(expr->node))
{
}
}
MD_FUNCTION_IMPL void
MD_OutputExpr_C(FILE *file, MD_Expr *expr)
{
MD_OutputExpr(file, expr);
}
MD_PRIVATE_FUNCTION_IMPL MD_b32
_MD_OutputType_C_NeedsParens(MD_Expr *type)
{