add const and volatile to type exprs; fix tag list parsing bug, restrict '@'s to symbol tokens

This commit is contained in:
ryanfleury
2021-02-06 20:23:29 -07:00
parent d96d76f167
commit 9da8264116
3 changed files with 45 additions and 7 deletions
+1
View File
@@ -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);
+3
View File
@@ -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
View File
@@ -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;
} }