Browse Source

Simplify parser logic for field prefixes

gingerBill 3 years ago
parent
commit
b886ae6515
2 changed files with 23 additions and 34 deletions
  1. 19 34
      src/parser.cpp
  2. 4 0
      src/parser.hpp

+ 19 - 34
src/parser.cpp

@@ -3550,49 +3550,34 @@ Ast *parse_var_type(AstFile *f, bool allow_ellipsis, bool allow_typeid_token) {
 }
 }
 
 
 
 
-enum FieldPrefixKind : i32 {
-	FieldPrefix_Unknown = -1,
-	FieldPrefix_Invalid = 0,
-
-	FieldPrefix_using, // implies #subtype
-	FieldPrefix_const,
-	FieldPrefix_no_alias,
-	FieldPrefix_c_vararg,
-	FieldPrefix_auto_cast,
-	FieldPrefix_any_int,
-	FieldPrefix_subtype, // does not imply `using` semantics
-	FieldPrefix_by_ptr,
-};
-
 struct ParseFieldPrefixMapping {
 struct ParseFieldPrefixMapping {
 	String          name;
 	String          name;
 	TokenKind       token_kind;
 	TokenKind       token_kind;
-	FieldPrefixKind prefix;
 	FieldFlag       flag;
 	FieldFlag       flag;
 };
 };
 
 
 gb_global ParseFieldPrefixMapping parse_field_prefix_mappings[] = {
 gb_global ParseFieldPrefixMapping parse_field_prefix_mappings[] = {
-	{str_lit("using"),      Token_using,     FieldPrefix_using,     FieldFlag_using},
-	{str_lit("auto_cast"),  Token_auto_cast, FieldPrefix_auto_cast, FieldFlag_auto_cast},
-	{str_lit("no_alias"),   Token_Hash,      FieldPrefix_no_alias,  FieldFlag_no_alias},
-	{str_lit("c_vararg"),   Token_Hash,      FieldPrefix_c_vararg,  FieldFlag_c_vararg},
-	{str_lit("const"),      Token_Hash,      FieldPrefix_const,     FieldFlag_const},
-	{str_lit("any_int"),    Token_Hash,      FieldPrefix_any_int,   FieldFlag_any_int},
-	{str_lit("subtype"),    Token_Hash,      FieldPrefix_subtype,   FieldFlag_subtype},
-	{str_lit("by_ptr"),     Token_Hash,      FieldPrefix_by_ptr,    FieldFlag_by_ptr},
+	{str_lit("using"),      Token_using,     FieldFlag_using},
+	{str_lit("auto_cast"),  Token_auto_cast, FieldFlag_auto_cast},
+	{str_lit("no_alias"),   Token_Hash,      FieldFlag_no_alias},
+	{str_lit("c_vararg"),   Token_Hash,      FieldFlag_c_vararg},
+	{str_lit("const"),      Token_Hash,      FieldFlag_const},
+	{str_lit("any_int"),    Token_Hash,      FieldFlag_any_int},
+	{str_lit("subtype"),    Token_Hash,      FieldFlag_subtype},
+	{str_lit("by_ptr"),     Token_Hash,      FieldFlag_by_ptr},
 };
 };
 
 
 
 
-FieldPrefixKind is_token_field_prefix(AstFile *f) {
+FieldFlag is_token_field_prefix(AstFile *f) {
 	switch (f->curr_token.kind) {
 	switch (f->curr_token.kind) {
 	case Token_EOF:
 	case Token_EOF:
-		return FieldPrefix_Invalid;
+		return FieldFlag_Invalid;
 
 
 	case Token_using:
 	case Token_using:
-		return FieldPrefix_using;
+		return FieldFlag_using;
 
 
 	case Token_auto_cast:
 	case Token_auto_cast:
-		return FieldPrefix_auto_cast;
+		return FieldFlag_auto_cast;
 
 
 	case Token_Hash:
 	case Token_Hash:
 		advance_token(f);
 		advance_token(f);
@@ -3602,33 +3587,33 @@ FieldPrefixKind is_token_field_prefix(AstFile *f) {
 				auto const &mapping = parse_field_prefix_mappings[i];
 				auto const &mapping = parse_field_prefix_mappings[i];
 				if (mapping.token_kind == Token_Hash) {
 				if (mapping.token_kind == Token_Hash) {
 					if (f->curr_token.string == mapping.name) {
 					if (f->curr_token.string == mapping.name) {
-						return mapping.prefix;
+						return mapping.flag;
 					}
 					}
 				}
 				}
 			}
 			}
 			break;
 			break;
 		}
 		}
-		return FieldPrefix_Unknown;
+		return FieldFlag_Unknown;
 	}
 	}
-	return FieldPrefix_Invalid;
+	return FieldFlag_Invalid;
 }
 }
 
 
 u32 parse_field_prefixes(AstFile *f) {
 u32 parse_field_prefixes(AstFile *f) {
 	i32 counts[gb_count_of(parse_field_prefix_mappings)] = {};
 	i32 counts[gb_count_of(parse_field_prefix_mappings)] = {};
 
 
 	for (;;) {
 	for (;;) {
-		FieldPrefixKind kind = is_token_field_prefix(f);
-		if (kind == FieldPrefix_Invalid) {
+		FieldFlag flag = is_token_field_prefix(f);
+		if (flag & FieldFlag_Invalid) {
 			break;
 			break;
 		}
 		}
-		if (kind == FieldPrefix_Unknown) {
+		if (flag & FieldFlag_Unknown) {
 			syntax_error(f->curr_token, "Unknown prefix kind '#%.*s'", LIT(f->curr_token.string));
 			syntax_error(f->curr_token, "Unknown prefix kind '#%.*s'", LIT(f->curr_token.string));
 			advance_token(f);
 			advance_token(f);
 			continue;
 			continue;
 		}
 		}
 
 
 		for (i32 i = 0; i < gb_count_of(parse_field_prefix_mappings); i++) {
 		for (i32 i = 0; i < gb_count_of(parse_field_prefix_mappings); i++) {
-			if (parse_field_prefix_mappings[i].prefix == kind) {
+			if (parse_field_prefix_mappings[i].flag == flag) {
 				counts[i] += 1;
 				counts[i] += 1;
 				advance_token(f);
 				advance_token(f);
 				break;
 				break;

+ 4 - 0
src/parser.hpp

@@ -308,6 +308,10 @@ enum FieldFlag : u32 {
 	FieldFlag_Tags      = 1<<10,
 	FieldFlag_Tags      = 1<<10,
 	FieldFlag_Results   = 1<<16,
 	FieldFlag_Results   = 1<<16,
 
 
+
+	FieldFlag_Unknown   = 1u<<30,
+	FieldFlag_Invalid   = 1u<<31,
+
 	// Parameter List Restrictions
 	// Parameter List Restrictions
 	FieldFlag_Signature = FieldFlag_ellipsis|FieldFlag_using|FieldFlag_no_alias|FieldFlag_c_vararg|FieldFlag_auto_cast|FieldFlag_const|FieldFlag_any_int|FieldFlag_by_ptr,
 	FieldFlag_Signature = FieldFlag_ellipsis|FieldFlag_using|FieldFlag_no_alias|FieldFlag_c_vararg|FieldFlag_auto_cast|FieldFlag_const|FieldFlag_any_int|FieldFlag_by_ptr,
 	FieldFlag_Struct    = FieldFlag_using|FieldFlag_subtype|FieldFlag_Tags,
 	FieldFlag_Struct    = FieldFlag_using|FieldFlag_subtype|FieldFlag_Tags,