Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 2ab31fd455e00a42c1e4c9e02584f49b0fc58707)
+++ src/Parser/parser.yy	(revision 12f115660af199443846e0eaf25044dc38abc565)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun 11 16:56:42 2024
-// Update Count     : 6638
+// Last Modified On : Tue Jun 11 21:32:15 2024
+// Update Count     : 6641
 //
 
@@ -387,5 +387,5 @@
 // names and constants: lexer differentiates between identifier and typedef names
 %token<tok> IDENTIFIER		TYPEDIMname		TYPEDEFname		TYPEGENname
-%token<tok> TIMEOUT			WAND	WOR			CATCH			RECOVER			CATCHRESUME		FIXUP		FINALLY		// CFA
+%token<tok> TIMEOUT			WAND	WOR		CATCH			RECOVER			CATCHRESUME		FIXUP		FINALLY		// CFA
 %token<tok> INTEGERconstant	CHARACTERconstant	STRINGliteral
 %token<tok> DIRECTIVE
@@ -493,5 +493,5 @@
 %type<decl> exception_declaration
 
-%type<decl> field_declaration_list_opt field_declaration field_declaring_list_opt field_declaring_list field_declarator field_abstract_list_opt field_abstract
+%type<decl> field_declaration_list_opt field_declaration field_declaring_list_opt field_declarator field_abstract_list_opt field_abstract
 %type<expr> field field_name_list field_name fraction_constants_opt
 
@@ -678,4 +678,10 @@
 	| '@'												// CFA
 		{ Token tok = { new string( DeclarationNode::anonymous.newName() ), yylval.tok.loc }; $$ = tok; }
+	;
+
+identifier_or_type_name:
+	identifier
+	| TYPEDEFname
+	| TYPEGENname
 	;
 
@@ -811,9 +817,5 @@
 		//       z.E;  // lexer returns E is TYPEDEFname
 		//   }
-	| postfix_expression '.' identifier
-		{ $$ = new ExpressionNode( build_fieldSel( yylloc, $1, build_varref( yylloc, $3 ) ) ); }
-	| postfix_expression '.' TYPEDEFname				// CFA, SKULLDUGGERY
-		{ $$ = new ExpressionNode( build_fieldSel( yylloc, $1, build_varref( yylloc, $3 ) ) ); }
-	| postfix_expression '.' TYPEGENname				// CFA, SKULLDUGGERY
+	| postfix_expression '.' identifier_or_type_name
 		{ $$ = new ExpressionNode( build_fieldSel( yylloc, $1, build_varref( yylloc, $3 ) ) ); }
 
@@ -1613,5 +1615,5 @@
 enum_key:
 	TYPEDEFname
-	| ENUM TYPEDEFname
+	| ENUM identifier_or_type_name
 	;
 
@@ -2692,10 +2694,6 @@
 	// empty
 		{ $$ = nullptr; }
-	| field_declaring_list
-	;
-
-field_declaring_list:
-	field_declarator
-	| field_declaring_list ',' attribute_list_opt field_declarator
+	| field_declarator
+	| field_declaring_list_opt ',' attribute_list_opt field_declarator
 		{ $$ = $1->set_last( $4->addQualifiers( $3 ) ); }
 	;
@@ -2961,10 +2959,4 @@
 	;
 
-identifier_or_type_name:
-	identifier
-	| TYPEDEFname
-	| TYPEGENname
-	;
-
 type_no_function:										// sizeof, alignof, cast (constructor)
 	cfa_abstract_declarator_tuple						// CFA
@@ -3230,5 +3222,5 @@
 	// empty, input file
 	| external_definition_list
-		{ parseTree = parseTree ? parseTree->set_last( $1 ) : $1;	}
+		{ parseTree = parseTree ? parseTree->set_last( $1 ) : $1; }
 	;
 
@@ -3488,8 +3480,5 @@
 
 attr_name:												// GCC
-	IDENTIFIER
-	| quasi_keyword
-	| TYPEDEFname
-	| TYPEGENname
+	identifier_or_type_name
 	| FALLTHROUGH
 		{ $$ = Token{ new string( "fallthrough" ), { nullptr, -1 } }; }
