diff --git a/samples/c_code_generation.c b/samples/c_code_generation.c index 816376d..36698e0 100644 --- a/samples/c_code_generation.c +++ b/samples/c_code_generation.c @@ -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); diff --git a/source/md.h b/source/md.h index 2be3d39..45bc281 100644 --- a/source/md.h +++ b/source/md.h @@ -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, } diff --git a/source/md_impl.c b/source/md_impl.c index 3ff42a1..6c28e32 100644 --- a/source/md_impl.c +++ b/source/md_impl.c @@ -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; }