mirror of
https://github.com/Ed94/metadesk.git
synced 2026-08-08 16:48:15 +00:00
add const and volatile to type exprs; fix tag list parsing bug, restrict '@'s to symbol tokens
This commit is contained in:
@@ -14,6 +14,7 @@ int main(int argument_count, char **arguments)
|
|||||||
" d: F32,\n"
|
" d: F32,\n"
|
||||||
" e: *[100]F32,\n"
|
" e: *[100]F32,\n"
|
||||||
" f: ([4 + 5]S32),\n"
|
" f: ([4 + 5]S32),\n"
|
||||||
|
" g: ([FOO + BAR]I32),\n"
|
||||||
"}\n\n");
|
"}\n\n");
|
||||||
MD_Node *code = MD_ParseWholeString(MD_S8Lit("Generated Test Code"), example_code);
|
MD_Node *code = MD_ParseWholeString(MD_S8Lit("Generated Test Code"), example_code);
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
// - Split out C-related stuff into helper language layers
|
// - Split out C-related stuff into helper language layers
|
||||||
// - Helpers for parsing NodeFlags, figuring out which nodes in a set are
|
// - Helpers for parsing NodeFlags, figuring out which nodes in a set are
|
||||||
// separated by a semicolon, something like MD_SeekNodeWithFlags(node) -> node ?
|
// separated by a semicolon, something like MD_SeekNodeWithFlags(node) -> node ?
|
||||||
|
// - Escaping characters from strings
|
||||||
|
|
||||||
// NOTE(allen): "Plugin" functionality
|
// NOTE(allen): "Plugin" functionality
|
||||||
//
|
//
|
||||||
@@ -549,6 +550,8 @@ typedef enum MD_ExprKind
|
|||||||
// NOTE(rjf): Type
|
// NOTE(rjf): Type
|
||||||
MD_ExprKind_Pointer,
|
MD_ExprKind_Pointer,
|
||||||
MD_ExprKind_Array,
|
MD_ExprKind_Array,
|
||||||
|
MD_ExprKind_Volatile,
|
||||||
|
MD_ExprKind_Const,
|
||||||
|
|
||||||
MD_ExprKind_MAX,
|
MD_ExprKind_MAX,
|
||||||
}
|
}
|
||||||
|
|||||||
+35
-1
@@ -1591,8 +1591,14 @@ _MD_ParseTagList(MD_ParseCtx *ctx, MD_Node **first_out, MD_Node **last_out)
|
|||||||
MD_Node *first = MD_NilNode();
|
MD_Node *first = MD_NilNode();
|
||||||
MD_Node *last = MD_NilNode();
|
MD_Node *last = MD_NilNode();
|
||||||
|
|
||||||
for(;MD_Parse_Require(ctx, MD_S8Lit("@"));)
|
for(;;)
|
||||||
{
|
{
|
||||||
|
MD_Token next_token = MD_Parse_PeekSkipSome(ctx, MD_TokenGroup_Comment | MD_TokenGroup_Whitespace);
|
||||||
|
if(MD_StringMatch(next_token.string, MD_S8Lit("@"), 0) &&
|
||||||
|
next_token.kind == MD_TokenKind_Symbol)
|
||||||
|
{
|
||||||
|
MD_Parse_Bump(ctx, next_token);
|
||||||
|
|
||||||
MD_Token name;
|
MD_Token name;
|
||||||
_MD_MemoryZero(&name, sizeof(name));
|
_MD_MemoryZero(&name, sizeof(name));
|
||||||
if(MD_Parse_RequireKind(ctx, MD_TokenKind_Identifier, &name))
|
if(MD_Parse_RequireKind(ctx, MD_TokenKind_Identifier, &name))
|
||||||
@@ -1606,6 +1612,11 @@ _MD_ParseTagList(MD_ParseCtx *ctx, MD_Node **first_out, MD_Node **last_out)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
*first_out = first;
|
*first_out = first;
|
||||||
*last_out = last;
|
*last_out = last;
|
||||||
@@ -2280,6 +2291,12 @@ _MD_ParseUnaryExpr(_MD_NodeParseCtx *ctx)
|
|||||||
result = MD_MakeExpr(node, MD_ExprKind_Atom, 0, 0);
|
result = MD_MakeExpr(node, MD_ExprKind_Atom, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE(rjf): Literal
|
||||||
|
else if(_MD_NodeParse_ConsumeAtom(ctx, &node))
|
||||||
|
{
|
||||||
|
result = MD_MakeExpr(node, MD_ExprKind_Atom, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE(rjf): Negative
|
// NOTE(rjf): Negative
|
||||||
else if(_MD_NodeParse_Consume(ctx, MD_S8Lit("-"), &node))
|
else if(_MD_NodeParse_Consume(ctx, MD_S8Lit("-"), &node))
|
||||||
{
|
{
|
||||||
@@ -2379,6 +2396,7 @@ MD_ParseAsType(MD_Node *first, MD_Node *last)
|
|||||||
MD_Node *set = 0;
|
MD_Node *set = 0;
|
||||||
MD_Node *ptr = 0;
|
MD_Node *ptr = 0;
|
||||||
MD_Node *base_type = 0;
|
MD_Node *base_type = 0;
|
||||||
|
MD_Node *node = 0;
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
if(_MD_NodeParse_Consume(ctx, MD_S8Lit("*"), &ptr))
|
if(_MD_NodeParse_Consume(ctx, MD_S8Lit("*"), &ptr))
|
||||||
@@ -2386,6 +2404,16 @@ MD_ParseAsType(MD_Node *first, MD_Node *last)
|
|||||||
MD_Expr *t = MD_MakeExpr(ptr, MD_ExprKind_Pointer, MD_NilExpr(), MD_NilExpr());
|
MD_Expr *t = MD_MakeExpr(ptr, MD_ExprKind_Pointer, MD_NilExpr(), MD_NilExpr());
|
||||||
_MD_PushType(t);
|
_MD_PushType(t);
|
||||||
}
|
}
|
||||||
|
else if(_MD_NodeParse_Consume(ctx, MD_S8Lit("volatile"), &node))
|
||||||
|
{
|
||||||
|
MD_Expr *t = MD_MakeExpr(node, MD_ExprKind_Volatile, MD_NilExpr(), MD_NilExpr());
|
||||||
|
_MD_PushType(t);
|
||||||
|
}
|
||||||
|
else if(_MD_NodeParse_Consume(ctx, MD_S8Lit("const"), &node))
|
||||||
|
{
|
||||||
|
MD_Expr *t = MD_MakeExpr(node, MD_ExprKind_Const, MD_NilExpr(), MD_NilExpr());
|
||||||
|
_MD_PushType(t);
|
||||||
|
}
|
||||||
else if(_MD_NodeParse_ConsumeSet(ctx, &set))
|
else if(_MD_NodeParse_ConsumeSet(ctx, &set))
|
||||||
{
|
{
|
||||||
MD_Expr *t = MD_MakeExpr(set, MD_ExprKind_Array, MD_NilExpr(), MD_NilExpr());
|
MD_Expr *t = MD_MakeExpr(set, MD_ExprKind_Array, MD_NilExpr(), MD_NilExpr());
|
||||||
@@ -2658,6 +2686,9 @@ MD_OutputType_C_LHS(FILE *file, MD_Expr *type)
|
|||||||
}
|
}
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
case MD_ExprKind_Volatile: { fprintf(file, "volatile "); }break;
|
||||||
|
case MD_ExprKind_Const: { fprintf(file, "const "); }break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
fprintf(file, "{ unexpected MD_ExprKind (%i) in type info for node \"%.*s\" }",
|
fprintf(file, "{ unexpected MD_ExprKind (%i) in type info for node \"%.*s\" }",
|
||||||
@@ -2696,6 +2727,9 @@ MD_OutputType_C_RHS(FILE *file, MD_Expr *type)
|
|||||||
MD_OutputType_C_RHS(file, type->sub[0]);
|
MD_OutputType_C_RHS(file, type->sub[0]);
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
|
case MD_ExprKind_Volatile: { fprintf(file, "volatile "); }break;
|
||||||
|
case MD_ExprKind_Const: { fprintf(file, "const "); }break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{}break;
|
{}break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user