[examples] struct member lists

This commit is contained in:
Allen Webster
2021-09-19 16:56:39 -07:00
parent 2be6caf79a
commit f0ca7effc5
2 changed files with 114 additions and 15 deletions
+6 -5
View File
@@ -4,18 +4,19 @@
og_path=$PWD
cd "$(dirname "$0")"
cd ..
root_path=$PWD
build_path=$root_path/build
examples_path=$root_path/examples
root_path=$PWD
build_path=$root_path/build
examps=$root_path/examples
echo ~~~ Running Type Metadata Example ~~~
cd $build_path
./type_metadata.exe $examples_path/mdesk_files/types.mdesk
./type_metadata.exe $examps/type_metadata/types.mdesk
echo
echo ~~~ Running Error Generation Example ~~~
cd $build_path
./user_errors.exe $examples_path/mdesk_files/user_errors.mdesk
./user_errors.exe $examps/user_errors/user_errors.mdesk
echo
###### Restore Path ###########################################################
+108 -10
View File
@@ -30,6 +30,19 @@ struct TypeInfo
TypeInfo *next;
TypeKind kind;
MD_Node *node;
// struct member list
struct TypeMember *first_member;
struct TypeMember *last_member;
int member_count;
};
typedef struct TypeMember TypeMember;
struct TypeMember
{
TypeMember *next;
MD_Node *node;
TypeInfo *type;
};
typedef struct MapInfo MapInfo;
@@ -56,9 +69,19 @@ MD_Map map_map = {0};
int
main(int argc, char **argv)
{
char *argv_dummy[2] = {
0,
"W:/metadesk/examples/type_metadata/types.mdesk"
};
argc = 2;
argv = argv_dummy;
// setup the global arena
arena = MD_ArenaAlloc();
// output stream routing
FILE *fstream_errors = stderr;
// parse all files passed to the command line
MD_Node *list = MD_MakeList(arena);
for(int i = 1; i < argc; i += 1)
@@ -73,7 +96,7 @@ main(int argc, char **argv)
message = message->next)
{
MD_CodeLoc code_loc = MD_CodeLocFromNode(message->node);
MD_PrintMessage(stderr, code_loc, message->kind, message->string);
MD_PrintMessage(fstream_errors, code_loc, message->kind, message->string);
}
// save to parse results list
@@ -110,12 +133,12 @@ main(int argc, char **argv)
if (kind == TypeKind_Null){
MD_CodeLoc loc = MD_CodeLocFromNode(node);
MD_PrintMessageFmt(stderr, loc, MD_MessageKind_Error,
MD_PrintMessageFmt(fstream_errors, loc, MD_MessageKind_Error,
"Unrecognized type kind '%.*s'\n",
MD_S8VArg(tag_arg_str));
}
else{
TypeInfo *type_info = MD_PushArray(arena, TypeInfo, 1);
TypeInfo *type_info = MD_PushArrayZero(arena, TypeInfo, 1);
type_info->kind = kind;
type_info->node = node;
@@ -138,6 +161,79 @@ main(int argc, char **argv)
}
}
// build struct member lists
for (TypeInfo *type = first_type;
type != 0;
type = type->next)
{
if (type->kind == TypeKind_Struct)
{
MD_b32 got_list = 1;
TypeMember *first_member = 0;
TypeMember *last_member = 0;
int member_count = 0;
MD_Node *type_root_node = type->node;
for (MD_EachNode(member_node, type_root_node->first_child))
{
MD_Node *type_name_node = member_node->first_child;
// missing type node?
if (MD_NodeIsNil(type_name_node))
{
MD_CodeLoc loc = MD_CodeLocFromNode(member_node);
MD_PrintMessage(fstream_errors, loc, MD_MessageKind_Error,
MD_S8Lit("Missing type name for member"));
got_list = 0;
goto skip_member;
}
// has type node:
MD_String8 type_name = type_name_node->string;
MD_MapSlot *type_info_slot = (MD_MapSlot*)MD_MapLookup(&type_map, MD_MapKeyStr(type_name));
// could not resolve type?
if (type_info_slot == 0)
{
MD_CodeLoc loc = MD_CodeLocFromNode(type_name_node);
MD_PrintMessageFmt(fstream_errors, loc, MD_MessageKind_Error,
"Could not resolve type name '%.*s'", MD_S8VArg(type_name));
got_list = 0;
goto skip_member;
}
// resolved type:
if (got_list)
{
TypeInfo *type_info = (TypeInfo*)type_info_slot->val;
TypeMember *member = MD_PushArray(arena, TypeMember, 1);
member->node = member_node;
member->type = type_info;
MD_QueuePush(first_member, last_member, member);
member_count += 1;
}
skip_member:;
}
if (got_list)
{
type->first_member = first_member;
type->last_member = last_member;
type->member_count = member_count;
}
}
}
// TODO check types & build member lists
// TODO check maps & build case lists
// TODO generate type definitions
// TODO generate function declarations
// TODO generate metadata tables
// TODO generate function definitions
// print state
for (TypeInfo *type = first_type;
type != 0;
@@ -152,6 +248,15 @@ main(int argc, char **argv)
MD_Node *node = type->node;
printf("%.*s: %s\n", MD_S8VArg(node->string), kind_string);
// print member lists
for (TypeMember *member = type->first_member;
member != 0;
member = member->next){
printf(" %.*s: %.*s\n",
MD_S8VArg(member->node->string),
MD_S8VArg(member->type->node->string));
}
}
for (MapInfo *map = first_map;
@@ -160,11 +265,4 @@ main(int argc, char **argv)
MD_Node *node = map->node;
printf("%.*s: map\n", MD_S8VArg(node->string));
}
// TODO check types & build member lists
// TODO check maps & build case lists
// TODO generate type definitions
// TODO generate function declarations
// TODO generate metadata tables
// TODO generate function definitions
}