starting to review mdesk.h/c

This commit is contained in:
ed
2025-02-08 11:10:23 -05:00
parent 43baf82a8b
commit 68fadce5c6
21 changed files with 1166 additions and 1153 deletions
+215 -215
View File
File diff suppressed because it is too large Load Diff
+114 -114
View File
@@ -548,88 +548,88 @@ MD_IdentifierStyle;
//~ Node types that are used to build all ASTs.
typedef enum MD_NodeKind
typedef enum NodeKind
{
// NOTE(rjf): @maintenance Must be kept in sync with MD_StringFromNodeKind.
MD_NodeKind_Nil,
NodeKind_Nil,
// NOTE(rjf): Generated by parser
MD_NodeKind_File,
MD_NodeKind_ErrorMarker,
NodeKind_File,
NodeKind_ErrorMarker,
// NOTE(rjf): Parsed from user Metadesk code
MD_NodeKind_Main,
MD_NodeKind_Tag,
NodeKind_Main,
NodeKind_Tag,
// NOTE(rjf): User-created data structures
MD_NodeKind_List,
MD_NodeKind_Reference,
NodeKind_List,
NodeKind_Reference,
MD_NodeKind_COUNT,
NodeKind_COUNT,
}
MD_NodeKind;
NodeKind;
typedef MD_u64 MD_NodeFlags;
#define MD_NodeFlag_AfterFromBefore(f) ((f) << 1)
typedef MD_u64 NodeFlags;
#define NodeFlag_AfterFromBefore(f) ((f) << 1)
enum
{
// NOTE(rjf): @maintenance Must be kept in sync with MD_StringListFromNodeFlags.
// NOTE(rjf): @maintenance Because of MD_NodeFlag_AfterFromBefore, it is
// NOTE(rjf): @maintenance Because of NodeFlag_AfterFromBefore, it is
// *required* that every single pair of "Before*" or "After*" flags be in
// the correct order which is that the Before* flag comes first, and the
// After* flag comes immediately after (After* being the more significant
// bit).
MD_NodeFlag_HasParenLeft = (1<<0),
MD_NodeFlag_HasParenRight = (1<<1),
MD_NodeFlag_HasBracketLeft = (1<<2),
MD_NodeFlag_HasBracketRight = (1<<3),
MD_NodeFlag_HasBraceLeft = (1<<4),
MD_NodeFlag_HasBraceRight = (1<<5),
NodeFlag_HasParenLeft = (1<<0),
NodeFlag_HasParenRight = (1<<1),
NodeFlag_HasBracketLeft = (1<<2),
NodeFlag_HasBracketRight = (1<<3),
NodeFlag_HasBraceLeft = (1<<4),
NodeFlag_HasBraceRight = (1<<5),
MD_NodeFlag_MaskSetDelimiters = (0x3F<<0),
NodeFlag_MaskSetDelimiters = (0x3F<<0),
MD_NodeFlag_IsBeforeSemicolon = (1<<6),
MD_NodeFlag_IsAfterSemicolon = (1<<7),
MD_NodeFlag_IsBeforeComma = (1<<8),
MD_NodeFlag_IsAfterComma = (1<<9),
NodeFlag_IsBeforeSemicolon = (1<<6),
NodeFlag_IsAfterSemicolon = (1<<7),
NodeFlag_IsBeforeComma = (1<<8),
NodeFlag_IsAfterComma = (1<<9),
MD_NodeFlag_MaskSeperators = (0xF<<6),
NodeFlag_MaskSeperators = (0xF<<6),
MD_NodeFlag_StringSingleQuote = (1<<10),
MD_NodeFlag_StringDoubleQuote = (1<<11),
MD_NodeFlag_StringTick = (1<<12),
MD_NodeFlag_StringTriplet = (1<<13),
NodeFlag_StringSingleQuote = (1<<10),
NodeFlag_StringDoubleQuote = (1<<11),
NodeFlag_StringTick = (1<<12),
NodeFlag_StringTriplet = (1<<13),
MD_NodeFlag_MaskStringDelimiters = (0xF<<10),
NodeFlag_MaskStringDelimiters = (0xF<<10),
MD_NodeFlag_Numeric = (1<<14),
MD_NodeFlag_Identifier = (1<<15),
MD_NodeFlag_StringLiteral = (1<<16),
MD_NodeFlag_Symbol = (1<<17),
NodeFlag_Numeric = (1<<14),
NodeFlag_Identifier = (1<<15),
NodeFlag_StringLiteral = (1<<16),
NodeFlag_Symbol = (1<<17),
MD_NodeFlag_MaskLabelKind = (0xF<<14),
NodeFlag_MaskLabelKind = (0xF<<14),
};
typedef struct MD_Node MD_Node;
struct MD_Node
typedef struct Node Node;
struct Node
{
// Tree relationship data.
MD_Node *next;
MD_Node *prev;
MD_Node *parent;
MD_Node *first_child;
MD_Node *last_child;
Node *next;
Node *prev;
Node *parent;
Node *first_child;
Node *last_child;
// Tag list.
MD_Node *first_tag;
MD_Node *last_tag;
Node *first_tag;
Node *last_tag;
// Node info.
MD_NodeKind kind;
MD_NodeFlags flags;
NodeKind kind;
NodeFlags flags;
MD_String8 string;
MD_String8 raw_string;
@@ -637,7 +637,7 @@ struct MD_Node
MD_u64 offset;
// Reference.
MD_Node *ref_target;
Node *ref_target;
// Comments.
// @usage prev_comment/next_comment should be considered "hidden". Rely on
@@ -710,26 +710,26 @@ enum
typedef MD_u32 MD_TokenGroups;
enum
{
MD_TokenGroup_Comment = MD_TokenKind_Comment,
MD_TokenGroup_Whitespace = (MD_TokenKind_Whitespace|
TokenGroup_Comment = MD_TokenKind_Comment,
TokenGroup_Whitespace = (MD_TokenKind_Whitespace|
MD_TokenKind_Newline),
MD_TokenGroup_Irregular = (MD_TokenGroup_Comment|
MD_TokenGroup_Whitespace),
MD_TokenGroup_Regular = ~MD_TokenGroup_Irregular,
MD_TokenGroup_Label = (MD_TokenKind_Identifier|
TokenGroup_Irregular = (TokenGroup_Comment|
TokenGroup_Whitespace),
TokenGroup_Regular = ~TokenGroup_Irregular,
TokenGroup_Label = (MD_TokenKind_Identifier|
MD_TokenKind_Numeric|
MD_TokenKind_StringLiteral|
MD_TokenKind_Symbol),
MD_TokenGroup_Error = (MD_TokenKind_BrokenComment|
TokenGroup_Error = (MD_TokenKind_BrokenComment|
MD_TokenKind_BrokenStringLiteral|
MD_TokenKind_BadCharacter),
};
typedef struct MD_Token MD_Token;
struct MD_Token
typedef struct Token Token;
struct Token
{
MD_TokenKind kind;
MD_NodeFlags node_flags;
NodeFlags node_flags;
MD_String8 string;
MD_String8 raw_string;
};
@@ -752,7 +752,7 @@ typedef struct MD_Message MD_Message;
struct MD_Message
{
MD_Message *next;
MD_Node *node;
Node *node;
MD_MessageKind kind;
MD_String8 string;
void *user_ptr;
@@ -774,10 +774,10 @@ typedef enum MD_ParseSetRule
MD_ParseSetRule_Global,
} MD_ParseSetRule;
typedef struct MD_ParseResult MD_ParseResult;
struct MD_ParseResult
typedef struct ParseResult ParseResult;
struct ParseResult
{
MD_Node *node;
Node *node;
MD_u64 string_advance;
MD_MessageList errors;
};
@@ -831,7 +831,7 @@ struct MD_Expr
};
struct MD_Expr *right;
MD_ExprOpr *op;
MD_Node *md_node;
Node *md_node;
};
typedef struct MD_ExprParseResult MD_ExprParseResult;
@@ -852,7 +852,7 @@ struct MD_ExprParseCtx
struct
{
MD_ExprOpr *postfix_set_ops[MD_POSTFIX_SETLIKE_OP_COUNT];
MD_NodeFlags postfix_set_flags[MD_POSTFIX_SETLIKE_OP_COUNT];
NodeFlags postfix_set_flags[MD_POSTFIX_SETLIKE_OP_COUNT];
} accel;
#undef MD_POSTFIX_SETLIKE_OP_COUNT
@@ -1060,8 +1060,8 @@ MD_FUNCTION MD_String8 MD_CStyleHexStringFromU64(MD_Arena *arena, MD_u64 x, MD_b
//~ Enum/Flag Strings
MD_FUNCTION MD_String8 MD_StringFromNodeKind(MD_NodeKind kind);
MD_FUNCTION MD_String8List MD_StringListFromNodeFlags(MD_Arena *arena, MD_NodeFlags flags);
MD_FUNCTION MD_String8 MD_StringFromNodeKind(NodeKind kind);
MD_FUNCTION MD_String8List MD_StringListFromNodeFlags(MD_Arena *arena, NodeFlags flags);
//~ Map Table Data Structure
@@ -1080,25 +1080,25 @@ MD_FUNCTION MD_MapSlot* MD_MapOverwrite(MD_Arena *arena, MD_Map *map, MD_MapKey
//~ Parsing
MD_FUNCTION MD_Token MD_TokenFromString(MD_String8 string);
MD_FUNCTION Token MD_TokenFromString(MD_String8 string);
MD_FUNCTION MD_u64 MD_LexAdvanceFromSkips(MD_String8 string, MD_TokenKind skip_kinds);
MD_FUNCTION MD_ParseResult MD_ParseResultZero(void);
MD_FUNCTION MD_ParseResult MD_ParseNodeSet(MD_Arena *arena, MD_String8 string, MD_u64 offset, MD_Node *parent,
MD_FUNCTION ParseResult MD_ParseResultZero(void);
MD_FUNCTION ParseResult MD_ParseNodeSet(MD_Arena *arena, MD_String8 string, MD_u64 offset, Node *parent,
MD_ParseSetRule rule);
MD_FUNCTION MD_ParseResult MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset);
MD_FUNCTION MD_ParseResult MD_ParseWholeString(MD_Arena *arena, MD_String8 filename, MD_String8 contents);
MD_FUNCTION ParseResult MD_ParseOneNode(MD_Arena *arena, MD_String8 string, MD_u64 offset);
MD_FUNCTION ParseResult MD_ParseWholeString(MD_Arena *arena, MD_String8 filename, MD_String8 contents);
MD_FUNCTION MD_ParseResult MD_ParseWholeFile(MD_Arena *arena, MD_String8 filename);
MD_FUNCTION ParseResult MD_ParseWholeFile(MD_Arena *arena, MD_String8 filename);
//~ Messages (Errors/Warnings)
MD_FUNCTION MD_Node* MD_MakeErrorMarkerNode(MD_Arena *arena, MD_String8 parse_contents,
MD_FUNCTION Node* MD_MakeErrorMarkerNode(MD_Arena *arena, MD_String8 parse_contents,
MD_u64 offset);
MD_FUNCTION MD_Message*MD_MakeNodeError(MD_Arena *arena, MD_Node *node,
MD_FUNCTION MD_Message*MD_MakeNodeError(MD_Arena *arena, Node *node,
MD_MessageKind kind, MD_String8 str);
MD_FUNCTION MD_Message*MD_MakeTokenError(MD_Arena *arena, MD_String8 parse_contents,
MD_Token token, MD_MessageKind kind,
Token token, MD_MessageKind kind,
MD_String8 str);
MD_FUNCTION void MD_MessageListPush(MD_MessageList *list, MD_Message *message);
@@ -1107,49 +1107,49 @@ MD_FUNCTION void MD_MessageListConcat(MD_MessageList *list, MD_MessageList
//~ Location Conversion
MD_FUNCTION MD_CodeLoc MD_CodeLocFromFileOffset(MD_String8 filename, MD_u8 *base, MD_u64 offset);
MD_FUNCTION MD_CodeLoc MD_CodeLocFromNode(MD_Node *node);
MD_FUNCTION MD_CodeLoc MD_CodeLocFromNode(Node *node);
//~ Tree/List Building
MD_FUNCTION MD_b32 MD_NodeIsNil(MD_Node *node);
MD_FUNCTION MD_Node *MD_NilNode(void);
MD_FUNCTION MD_Node *MD_MakeNode(MD_Arena *arena, MD_NodeKind kind, MD_String8 string,
MD_FUNCTION MD_b32 MD_NodeIsNil(Node *node);
MD_FUNCTION Node *MD_NilNode(void);
MD_FUNCTION Node *MD_MakeNode(MD_Arena *arena, NodeKind kind, MD_String8 string,
MD_String8 raw_string, MD_u64 offset);
MD_FUNCTION void MD_PushChild(MD_Node *parent, MD_Node *new_child);
MD_FUNCTION void MD_PushTag(MD_Node *node, MD_Node *tag);
MD_FUNCTION void MD_PushChild(Node *parent, Node *new_child);
MD_FUNCTION void MD_PushTag(Node *node, Node *tag);
MD_FUNCTION MD_Node *MD_MakeList(MD_Arena *arena);
MD_FUNCTION void MD_ListConcatInPlace(MD_Node *list, MD_Node *to_push);
MD_FUNCTION MD_Node *MD_PushNewReference(MD_Arena *arena, MD_Node *list, MD_Node *target);
MD_FUNCTION Node *MD_MakeList(MD_Arena *arena);
MD_FUNCTION void MD_ListConcatInPlace(Node *list, Node *to_push);
MD_FUNCTION Node *MD_PushNewReference(MD_Arena *arena, Node *list, Node *target);
//~ Introspection Helpers
// These calls are for getting info from nodes, and introspecting
// on trees that are returned to you by the parser.
MD_FUNCTION MD_Node * MD_FirstNodeWithString(MD_Node *first, MD_String8 string, MD_MatchFlags flags);
MD_FUNCTION MD_Node * MD_NodeAtIndex(MD_Node *first, int n);
MD_FUNCTION MD_Node * MD_FirstNodeWithFlags(MD_Node *first, MD_NodeFlags flags);
MD_FUNCTION int MD_IndexFromNode(MD_Node *node);
MD_FUNCTION MD_Node * MD_RootFromNode(MD_Node *node);
MD_FUNCTION MD_Node * MD_ChildFromString(MD_Node *node, MD_String8 child_string, MD_MatchFlags flags);
MD_FUNCTION MD_Node * MD_TagFromString(MD_Node *node, MD_String8 tag_string, MD_MatchFlags flags);
MD_FUNCTION MD_Node * MD_ChildFromIndex(MD_Node *node, int n);
MD_FUNCTION MD_Node * MD_TagFromIndex(MD_Node *node, int n);
MD_FUNCTION MD_Node * MD_TagArgFromIndex(MD_Node *node, MD_String8 tag_string, MD_MatchFlags flags, int n);
MD_FUNCTION MD_Node * MD_TagArgFromString(MD_Node *node, MD_String8 tag_string, MD_MatchFlags tag_str_flags, MD_String8 arg_string, MD_MatchFlags arg_str_flags);
MD_FUNCTION MD_b32 MD_NodeHasChild(MD_Node *node, MD_String8 string, MD_MatchFlags flags);
MD_FUNCTION MD_b32 MD_NodeHasTag(MD_Node *node, MD_String8 string, MD_MatchFlags flags);
MD_FUNCTION MD_i64 MD_ChildCountFromNode(MD_Node *node);
MD_FUNCTION MD_i64 MD_TagCountFromNode(MD_Node *node);
MD_FUNCTION MD_Node * MD_ResolveNodeFromReference(MD_Node *node);
MD_FUNCTION MD_Node* MD_NodeNextWithLimit(MD_Node *node, MD_Node *opl);
MD_FUNCTION Node * MD_FirstNodeWithString(Node *first, MD_String8 string, MD_MatchFlags flags);
MD_FUNCTION Node * MD_NodeAtIndex(Node *first, int n);
MD_FUNCTION Node * MD_FirstNodeWithFlags(Node *first, NodeFlags flags);
MD_FUNCTION int MD_IndexFromNode(Node *node);
MD_FUNCTION Node * MD_RootFromNode(Node *node);
MD_FUNCTION Node * MD_ChildFromString(Node *node, MD_String8 child_string, MD_MatchFlags flags);
MD_FUNCTION Node * MD_TagFromString(Node *node, MD_String8 tag_string, MD_MatchFlags flags);
MD_FUNCTION Node * MD_ChildFromIndex(Node *node, int n);
MD_FUNCTION Node * MD_TagFromIndex(Node *node, int n);
MD_FUNCTION Node * MD_TagArgFromIndex(Node *node, MD_String8 tag_string, MD_MatchFlags flags, int n);
MD_FUNCTION Node * MD_TagArgFromString(Node *node, MD_String8 tag_string, MD_MatchFlags tag_str_flags, MD_String8 arg_string, MD_MatchFlags arg_str_flags);
MD_FUNCTION MD_b32 MD_NodeHasChild(Node *node, MD_String8 string, MD_MatchFlags flags);
MD_FUNCTION MD_b32 MD_NodeHasTag(Node *node, MD_String8 string, MD_MatchFlags flags);
MD_FUNCTION MD_i64 MD_ChildCountFromNode(Node *node);
MD_FUNCTION MD_i64 MD_TagCountFromNode(Node *node);
MD_FUNCTION Node * MD_ResolveNodeFromReference(Node *node);
MD_FUNCTION Node* MD_NodeNextWithLimit(Node *node, Node *opl);
MD_FUNCTION MD_String8 MD_PrevCommentFromNode(MD_Node *node);
MD_FUNCTION MD_String8 MD_NextCommentFromNode(MD_Node *node);
MD_FUNCTION MD_String8 MD_PrevCommentFromNode(Node *node);
MD_FUNCTION MD_String8 MD_NextCommentFromNode(Node *node);
// NOTE(rjf): For-Loop Helpers
#define MD_EachNode(it, first) MD_Node *it = (first); !MD_NodeIsNil(it); it = it->next
#define MD_EachNode(it, first) Node *it = (first); !MD_NodeIsNil(it); it = it->next
//~ Error/Warning Helpers
@@ -1173,8 +1173,8 @@ MD_FUNCTION void MD_PrintMessageFmt(FILE *file, MD_CodeLoc code_loc, MD_MessageK
//~ Tree Comparison/Verification
MD_FUNCTION MD_b32 MD_NodeMatch(MD_Node *a, MD_Node *b, MD_MatchFlags flags);
MD_FUNCTION MD_b32 MD_NodeDeepMatch(MD_Node *a, MD_Node *b, MD_MatchFlags flags);
MD_FUNCTION MD_b32 MD_NodeMatch(Node *a, Node *b, MD_MatchFlags flags);
MD_FUNCTION MD_b32 MD_NodeDeepMatch(Node *a, Node *b, MD_MatchFlags flags);
//~ Expression Parsing
@@ -1189,34 +1189,34 @@ MD_FUNCTION MD_ExprOpr* MD_ExprOprFromKindString(MD_ExprOprTable *table,
MD_ExprOprKind kind, MD_String8 s);
MD_FUNCTION MD_ExprParseResult MD_ExprParse(MD_Arena *arena, MD_ExprOprTable *op_table,
MD_Node *first, MD_Node *one_past_last);
Node *first, Node *one_past_last);
MD_FUNCTION MD_Expr* MD_Expr_NewLeaf(MD_Arena *arena, MD_Node *node);
MD_FUNCTION MD_Expr* MD_Expr_NewOpr(MD_Arena *arena, MD_ExprOpr *op, MD_Node *op_node,
MD_FUNCTION MD_Expr* MD_Expr_NewLeaf(MD_Arena *arena, Node *node);
MD_FUNCTION MD_Expr* MD_Expr_NewOpr(MD_Arena *arena, MD_ExprOpr *op, Node *op_node,
MD_Expr *left, MD_Expr *right);
MD_FUNCTION MD_ExprParseCtx MD_ExprParse_MakeContext(MD_ExprOprTable *table);
MD_FUNCTION MD_Expr* MD_ExprParse_TopLevel(MD_Arena *arena, MD_ExprParseCtx *ctx,
MD_Node *first, MD_Node *opl);
Node *first, Node *opl);
MD_FUNCTION MD_b32 MD_ExprParse_OprConsume(MD_ExprParseCtx *ctx,
MD_Node **iter, MD_Node *opl,
Node **iter, Node *opl,
MD_ExprOprKind kind,
MD_u32 min_precedence,
MD_ExprOpr **op_out);
MD_FUNCTION MD_Expr* MD_ExprParse_Atom(MD_Arena *arena, MD_ExprParseCtx *ctx,
MD_Node **iter, MD_Node *first, MD_Node *opl);
Node **iter, Node *first, Node *opl);
MD_FUNCTION MD_Expr* MD_ExprParse_MinPrecedence(MD_Arena *arena, MD_ExprParseCtx *ctx,
MD_Node **iter, MD_Node *first, MD_Node *opl,
Node **iter, Node *first, Node *opl,
MD_u32 min_precedence);
//~ String Generation
MD_FUNCTION void MD_DebugDumpFromNode(MD_Arena *arena, MD_String8List *out, MD_Node *node,
MD_FUNCTION void MD_DebugDumpFromNode(MD_Arena *arena, MD_String8List *out, Node *node,
int indent, MD_String8 indent_string,
MD_GenerateFlags flags);
MD_FUNCTION void MD_ReconstructionFromNode(MD_Arena *arena, MD_String8List *out, MD_Node *node,
MD_FUNCTION void MD_ReconstructionFromNode(MD_Arena *arena, MD_String8List *out, Node *node,
int indent, MD_String8 indent_string);
//~ Command Line Argument Helper