mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-07 16:18:49 +00:00
start arranging for more functions to be public; simplify set parse function
This commit is contained in:
+21
-3
@@ -306,6 +306,9 @@ typedef enum MD_NodeKind
|
|||||||
MD_NodeKind_File,
|
MD_NodeKind_File,
|
||||||
MD_NodeKind_List,
|
MD_NodeKind_List,
|
||||||
MD_NodeKind_Reference,
|
MD_NodeKind_Reference,
|
||||||
|
// TODO(allen): Proposal names for "Label"
|
||||||
|
// String, Value, Content, Center, Trunk, Branch,
|
||||||
|
// Cell, Entity, Node, Code
|
||||||
MD_NodeKind_Label,
|
MD_NodeKind_Label,
|
||||||
MD_NodeKind_Tag,
|
MD_NodeKind_Tag,
|
||||||
MD_NodeKind_ErrorMarker,
|
MD_NodeKind_ErrorMarker,
|
||||||
@@ -492,6 +495,15 @@ struct MD_Error
|
|||||||
MD_MessageKind kind;
|
MD_MessageKind kind;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef MD_u32 MD_ParseSetFlags;
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
MD_ParseSetFlag_Paren = (1<<0),
|
||||||
|
MD_ParseSetFlag_Brace = (1<<1),
|
||||||
|
MD_ParseSetFlag_Bracket = (1<<2),
|
||||||
|
MD_ParseSetFlag_Implicit = (1<<3),
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct MD_ParseCtx MD_ParseCtx;
|
typedef struct MD_ParseCtx MD_ParseCtx;
|
||||||
struct MD_ParseCtx
|
struct MD_ParseCtx
|
||||||
{
|
{
|
||||||
@@ -643,9 +655,15 @@ MD_FUNCTION MD_Token MD_Parse_PeekSkipSome(MD_ParseCtx *ctx, MD_TokenGroup
|
|||||||
MD_FUNCTION MD_b32 MD_Parse_TokenMatch(MD_Token token, MD_String8 string, MD_MatchFlags flags);
|
MD_FUNCTION MD_b32 MD_Parse_TokenMatch(MD_Token token, MD_String8 string, MD_MatchFlags flags);
|
||||||
MD_FUNCTION MD_b32 MD_Parse_Require(MD_ParseCtx *ctx, MD_String8 string, MD_TokenKind kind);
|
MD_FUNCTION MD_b32 MD_Parse_Require(MD_ParseCtx *ctx, MD_String8 string, MD_TokenKind kind);
|
||||||
MD_FUNCTION MD_b32 MD_Parse_RequireKind(MD_ParseCtx *ctx, MD_TokenKind kind, MD_Token *out_token);
|
MD_FUNCTION MD_b32 MD_Parse_RequireKind(MD_ParseCtx *ctx, MD_TokenKind kind, MD_Token *out_token);
|
||||||
MD_FUNCTION MD_ParseResult MD_ParseOneNode (MD_String8 filename, MD_String8 contents);
|
|
||||||
MD_FUNCTION MD_ParseResult MD_ParseWholeString (MD_String8 filename, MD_String8 contents);
|
MD_FUNCTION void MD_Parse_Set(MD_ParseCtx *ctx, MD_Node *parent,
|
||||||
MD_FUNCTION MD_ParseResult MD_ParseWholeFile (MD_String8 filename);
|
MD_ParseSetFlags flags);
|
||||||
|
|
||||||
|
MD_FUNCTION MD_ParseResult MD_ParseOneNodeFromCtx(MD_ParseCtx *ctx);
|
||||||
|
|
||||||
|
MD_FUNCTION MD_ParseResult MD_ParseOneNode(MD_String8 filename, MD_String8 contents);
|
||||||
|
MD_FUNCTION MD_ParseResult MD_ParseWholeString(MD_String8 filename, MD_String8 contents);
|
||||||
|
MD_FUNCTION MD_ParseResult MD_ParseWholeFile(MD_String8 filename);
|
||||||
|
|
||||||
//~ Location Conversion
|
//~ Location Conversion
|
||||||
MD_FUNCTION MD_CodeLoc MD_CodeLocFromFileOffset(MD_String8 filename, MD_u8 *base, MD_u8 *off);
|
MD_FUNCTION MD_CodeLoc MD_CodeLocFromFileOffset(MD_String8 filename, MD_u8 *base, MD_u8 *off);
|
||||||
|
|||||||
+29
-45
@@ -1603,17 +1603,6 @@ _MD_MakeNodeFromString_Ctx(MD_ParseCtx *ctx, MD_NodeKind kind, MD_String8 string
|
|||||||
return _MD_MakeNode(kind, string, string, ctx->filename, ctx->file_contents.str, at);
|
return _MD_MakeNode(kind, string, string, ctx->filename, ctx->file_contents.str, at);
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef MD_u32 _MD_ParseSetFlags;
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
_MD_ParseSetFlag_Paren = (1<<0),
|
|
||||||
_MD_ParseSetFlag_Brace = (1<<1),
|
|
||||||
_MD_ParseSetFlag_Bracket = (1<<2),
|
|
||||||
_MD_ParseSetFlag_Implicit = (1<<3),
|
|
||||||
};
|
|
||||||
|
|
||||||
MD_PRIVATE_FUNCTION_IMPL MD_ParseResult _MD_ParseOneNode(MD_ParseCtx *ctx);
|
|
||||||
MD_PRIVATE_FUNCTION_IMPL void _MD_ParseSet(MD_ParseCtx *ctx, MD_Node *parent, _MD_ParseSetFlags flags, MD_Node **first_out, MD_Node **last_out);
|
|
||||||
MD_PRIVATE_FUNCTION_IMPL void _MD_ParseTagList(MD_ParseCtx *ctx, MD_Node **first_out, MD_Node **last_out);
|
MD_PRIVATE_FUNCTION_IMPL void _MD_ParseTagList(MD_ParseCtx *ctx, MD_Node **first_out, MD_Node **last_out);
|
||||||
|
|
||||||
MD_PRIVATE_FUNCTION_IMPL MD_NodeFlags
|
MD_PRIVATE_FUNCTION_IMPL MD_NodeFlags
|
||||||
@@ -1649,8 +1638,8 @@ _MD_CommentIsSyntacticallyCorrect(MD_Token comment_token)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
MD_PRIVATE_FUNCTION_IMPL MD_ParseResult
|
MD_FUNCTION_IMPL MD_ParseResult
|
||||||
_MD_ParseOneNode(MD_ParseCtx *ctx)
|
MD_ParseOneNodeFromCtx(MD_ParseCtx *ctx)
|
||||||
{
|
{
|
||||||
MD_u8 *at_first = ctx->at;
|
MD_u8 *at_first = ctx->at;
|
||||||
|
|
||||||
@@ -1720,12 +1709,10 @@ _MD_ParseOneNode(MD_ParseCtx *ctx)
|
|||||||
{
|
{
|
||||||
result.node = _MD_MakeNodeFromString_Ctx(ctx, MD_NodeKind_Label, MD_S8Lit(""), next_token.outer_string.str);
|
result.node = _MD_MakeNodeFromString_Ctx(ctx, MD_NodeKind_Label, MD_S8Lit(""), next_token.outer_string.str);
|
||||||
|
|
||||||
_MD_ParseSet(ctx, result.node,
|
MD_Parse_Set(ctx, result.node,
|
||||||
_MD_ParseSetFlag_Paren |
|
MD_ParseSetFlag_Paren |
|
||||||
_MD_ParseSetFlag_Brace |
|
MD_ParseSetFlag_Brace |
|
||||||
_MD_ParseSetFlag_Bracket,
|
MD_ParseSetFlag_Bracket);
|
||||||
&result.node->first_child,
|
|
||||||
&result.node->last_child);
|
|
||||||
goto end_parse;
|
goto end_parse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1764,13 +1751,11 @@ _MD_ParseOneNode(MD_ParseCtx *ctx)
|
|||||||
// NOTE(rjf): Children
|
// NOTE(rjf): Children
|
||||||
if(MD_Parse_Require(ctx, MD_S8Lit(":"), MD_TokenKind_Symbol))
|
if(MD_Parse_Require(ctx, MD_S8Lit(":"), MD_TokenKind_Symbol))
|
||||||
{
|
{
|
||||||
_MD_ParseSet(ctx, result.node,
|
MD_Parse_Set(ctx, result.node,
|
||||||
_MD_ParseSetFlag_Paren |
|
MD_ParseSetFlag_Paren |
|
||||||
_MD_ParseSetFlag_Brace |
|
MD_ParseSetFlag_Brace |
|
||||||
_MD_ParseSetFlag_Bracket |
|
MD_ParseSetFlag_Bracket |
|
||||||
_MD_ParseSetFlag_Implicit,
|
MD_ParseSetFlag_Implicit);
|
||||||
&result.node->first_child,
|
|
||||||
&result.node->last_child);
|
|
||||||
|
|
||||||
// NOTE(mal): Generate error for tags in positions such as "label:@tag {children}"
|
// NOTE(mal): Generate error for tags in positions such as "label:@tag {children}"
|
||||||
MD_Node *fc = result.node->first_child;
|
MD_Node *fc = result.node->first_child;
|
||||||
@@ -1850,33 +1835,32 @@ _MD_ParseOneNode(MD_ParseCtx *ctx)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
MD_PRIVATE_FUNCTION_IMPL void
|
MD_FUNCTION_IMPL void
|
||||||
_MD_ParseSet(MD_ParseCtx *ctx, MD_Node *parent, _MD_ParseSetFlags flags,
|
MD_Parse_Set(MD_ParseCtx *ctx, MD_Node *parent, MD_ParseSetFlags flags)
|
||||||
MD_Node **first_out, MD_Node **last_out)
|
|
||||||
{
|
{
|
||||||
MD_Node *first = MD_NilNode();
|
|
||||||
MD_Node *last = MD_NilNode();
|
|
||||||
|
|
||||||
MD_b32 brace = 0;
|
MD_b32 brace = 0;
|
||||||
MD_b32 paren = 0;
|
MD_b32 paren = 0;
|
||||||
MD_b32 bracket = 0;
|
MD_b32 bracket = 0;
|
||||||
MD_b32 terminate_with_separator = !!(flags & _MD_ParseSetFlag_Implicit);
|
MD_b32 terminate_with_separator = (!!(flags & MD_ParseSetFlag_Implicit));
|
||||||
|
|
||||||
MD_Token initial_token = MD_Parse_PeekSkipSome(ctx, MD_TokenGroup_Comment|MD_TokenGroup_Whitespace);
|
MD_Token initial_token = MD_Parse_PeekSkipSome(ctx, MD_TokenGroup_Comment|MD_TokenGroup_Whitespace);
|
||||||
|
|
||||||
if(flags & _MD_ParseSetFlag_Brace && MD_Parse_Require(ctx, MD_S8Lit("{"), MD_TokenKind_Symbol))
|
if((flags & MD_ParseSetFlag_Brace) &&
|
||||||
|
MD_Parse_Require(ctx, MD_S8Lit("{"), MD_TokenKind_Symbol))
|
||||||
{
|
{
|
||||||
parent->flags |= MD_NodeFlag_BraceLeft;
|
parent->flags |= MD_NodeFlag_BraceLeft;
|
||||||
brace = 1;
|
brace = 1;
|
||||||
terminate_with_separator = 0;
|
terminate_with_separator = 0;
|
||||||
}
|
}
|
||||||
else if(flags & _MD_ParseSetFlag_Paren && MD_Parse_Require(ctx, MD_S8Lit("("), MD_TokenKind_Symbol))
|
else if((flags & MD_ParseSetFlag_Paren) &&
|
||||||
|
MD_Parse_Require(ctx, MD_S8Lit("("), MD_TokenKind_Symbol))
|
||||||
{
|
{
|
||||||
parent->flags |= MD_NodeFlag_ParenLeft;
|
parent->flags |= MD_NodeFlag_ParenLeft;
|
||||||
paren = 1;
|
paren = 1;
|
||||||
terminate_with_separator = 0;
|
terminate_with_separator = 0;
|
||||||
}
|
}
|
||||||
else if(flags & _MD_ParseSetFlag_Bracket && MD_Parse_Require(ctx, MD_S8Lit("["), MD_TokenKind_Symbol))
|
else if((flags & MD_ParseSetFlag_Bracket) &&
|
||||||
|
MD_Parse_Require(ctx, MD_S8Lit("["), MD_TokenKind_Symbol))
|
||||||
{
|
{
|
||||||
parent->flags |= MD_NodeFlag_BracketLeft;
|
parent->flags |= MD_NodeFlag_BracketLeft;
|
||||||
bracket = 1;
|
bracket = 1;
|
||||||
@@ -1900,12 +1884,14 @@ _MD_ParseSet(MD_ParseCtx *ctx, MD_Node *parent, _MD_ParseSetFlags flags,
|
|||||||
}
|
}
|
||||||
else if(paren || bracket)
|
else if(paren || bracket)
|
||||||
{
|
{
|
||||||
if(flags & _MD_ParseSetFlag_Paren && MD_Parse_Require(ctx, MD_S8Lit(")"), MD_TokenKind_Symbol))
|
if((flags & MD_ParseSetFlag_Paren) &&
|
||||||
|
MD_Parse_Require(ctx, MD_S8Lit(")"), MD_TokenKind_Symbol))
|
||||||
{
|
{
|
||||||
parent->flags |= MD_NodeFlag_ParenRight;
|
parent->flags |= MD_NodeFlag_ParenRight;
|
||||||
goto end_parse;
|
goto end_parse;
|
||||||
}
|
}
|
||||||
else if(flags & _MD_ParseSetFlag_Bracket && MD_Parse_Require(ctx, MD_S8Lit("]"), MD_TokenKind_Symbol))
|
else if((flags & MD_ParseSetFlag_Bracket) &&
|
||||||
|
MD_Parse_Require(ctx, MD_S8Lit("]"), MD_TokenKind_Symbol))
|
||||||
{
|
{
|
||||||
parent->flags |= MD_NodeFlag_BracketRight;
|
parent->flags |= MD_NodeFlag_BracketRight;
|
||||||
goto end_parse;
|
goto end_parse;
|
||||||
@@ -1923,7 +1909,7 @@ _MD_ParseSet(MD_ParseCtx *ctx, MD_Node *parent, _MD_ParseSetFlags flags,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MD_ParseResult parse = _MD_ParseOneNode(ctx);
|
MD_ParseResult parse = MD_ParseOneNodeFromCtx(ctx);
|
||||||
MD_Node *child = parse.node;
|
MD_Node *child = parse.node;
|
||||||
child->flags |= next_child_flags;
|
child->flags |= next_child_flags;
|
||||||
next_child_flags = 0;
|
next_child_flags = 0;
|
||||||
@@ -1941,7 +1927,7 @@ _MD_ParseSet(MD_ParseCtx *ctx, MD_Node *parent, _MD_ParseSetFlags flags,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_MD_PushNodeToList(&first, &last, parent, child);
|
_MD_PushNodeToList(&parent->first_child, &parent->last_child, parent, child);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(rjf): Separators.
|
// NOTE(rjf): Separators.
|
||||||
@@ -1978,8 +1964,6 @@ _MD_ParseSet(MD_ParseCtx *ctx, MD_Node *parent, _MD_ParseSetFlags flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
end_parse:;
|
end_parse:;
|
||||||
*first_out = first;
|
|
||||||
*last_out = last;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MD_PRIVATE_FUNCTION_IMPL void
|
MD_PRIVATE_FUNCTION_IMPL void
|
||||||
@@ -2003,7 +1987,7 @@ _MD_ParseTagList(MD_ParseCtx *ctx, MD_Node **first_out, MD_Node **last_out)
|
|||||||
MD_Token token = MD_Parse_PeekSkipSome(ctx, 0);
|
MD_Token token = MD_Parse_PeekSkipSome(ctx, 0);
|
||||||
if(MD_StringMatch(token.string, MD_S8Lit("("), 0))
|
if(MD_StringMatch(token.string, MD_S8Lit("("), 0))
|
||||||
{
|
{
|
||||||
_MD_ParseSet(ctx, tag, _MD_ParseSetFlag_Paren, &tag->first_child, &tag->last_child);
|
MD_Parse_Set(ctx, tag, MD_ParseSetFlag_Paren);
|
||||||
}
|
}
|
||||||
_MD_PushNodeToList(&first, &last, MD_NilNode(), tag);
|
_MD_PushNodeToList(&first, &last, MD_NilNode(), tag);
|
||||||
}
|
}
|
||||||
@@ -2030,7 +2014,7 @@ MD_FUNCTION_IMPL MD_ParseResult
|
|||||||
MD_ParseOneNode(MD_String8 filename, MD_String8 contents)
|
MD_ParseOneNode(MD_String8 filename, MD_String8 contents)
|
||||||
{
|
{
|
||||||
MD_ParseCtx ctx = MD_Parse_InitializeCtx(filename, contents);
|
MD_ParseCtx ctx = MD_Parse_InitializeCtx(filename, contents);
|
||||||
return _MD_ParseOneNode(&ctx);
|
return MD_ParseOneNodeFromCtx(&ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
MD_PRIVATE_FUNCTION_IMPL void
|
MD_PRIVATE_FUNCTION_IMPL void
|
||||||
@@ -2097,7 +2081,7 @@ MD_ParseWholeString(MD_String8 filename, MD_String8 contents)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MD_ParseResult parse = _MD_ParseOneNode(&ctx);
|
MD_ParseResult parse = MD_ParseOneNodeFromCtx(&ctx);
|
||||||
MD_Node *child = parse.node;
|
MD_Node *child = parse.node;
|
||||||
child->flags |= next_child_flags;
|
child->flags |= next_child_flags;
|
||||||
next_child_flags = 0;
|
next_child_flags = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user