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"
" e: *[100]F32,\n"
" f: ([4 + 5]S32),\n"
" g: ([FOO + BAR]I32),\n"
"}\n\n");
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
// - Helpers for parsing NodeFlags, figuring out which nodes in a set are
// separated by a semicolon, something like MD_SeekNodeWithFlags(node) -> node ?
// - Escaping characters from strings
// NOTE(allen): "Plugin" functionality
//
@@ -549,6 +550,8 @@ typedef enum MD_ExprKind
// NOTE(rjf): Type
MD_ExprKind_Pointer,
MD_ExprKind_Array,
MD_ExprKind_Volatile,
MD_ExprKind_Const,
MD_ExprKind_MAX,
}
+41 -7
View File
@@ -1591,15 +1591,26 @@ _MD_ParseTagList(MD_ParseCtx *ctx, MD_Node **first_out, MD_Node **last_out)
MD_Node *first = MD_NilNode();
MD_Node *last = MD_NilNode();
for(;MD_Parse_Require(ctx, MD_S8Lit("@"));)
for(;;)
{
MD_Token name;
_MD_MemoryZero(&name, sizeof(name));
if(MD_Parse_RequireKind(ctx, MD_TokenKind_Identifier, &name))
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_Node *tag = _MD_MakeNodeFromToken_Ctx(ctx, MD_NodeKind_Tag, name);
_MD_ParseSet(ctx, tag, _MD_ParseSetFlag_Paren, &tag->first_child, &tag->last_child);
_MD_PushNodeToList(&first, &last, MD_NilNode(), tag);
MD_Parse_Bump(ctx, next_token);
MD_Token name;
_MD_MemoryZero(&name, sizeof(name));
if(MD_Parse_RequireKind(ctx, MD_TokenKind_Identifier, &name))
{
MD_Node *tag = _MD_MakeNodeFromToken_Ctx(ctx, MD_NodeKind_Tag, name);
_MD_ParseSet(ctx, tag, _MD_ParseSetFlag_Paren, &tag->first_child, &tag->last_child);
_MD_PushNodeToList(&first, &last, MD_NilNode(), tag);
}
else
{
break;
}
}
else
{
@@ -2280,6 +2291,12 @@ _MD_ParseUnaryExpr(_MD_NodeParseCtx *ctx)
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
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 *ptr = 0;
MD_Node *base_type = 0;
MD_Node *node = 0;
for(;;)
{
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_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))
{
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;
case MD_ExprKind_Volatile: { fprintf(file, "volatile "); }break;
case MD_ExprKind_Const: { fprintf(file, "const "); }break;
default:
{
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]);
}break;
case MD_ExprKind_Volatile: { fprintf(file, "volatile "); }break;
case MD_ExprKind_Const: { fprintf(file, "const "); }break;
default:
{}break;
}