Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 1d5e560193e4f0f7925e8e5df29a9b1f4638a344)
+++ src/Parser/lex.ll	(revision 647e2ea4f54e975bd697890e305f6c7f6d4e7462)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Tue Oct  3 17:10:57 2023
- * Update Count     : 773
+ * Last Modified On : Sat Feb 24 11:47:24 2024
+ * Update Count     : 777
  */
 
@@ -407,4 +407,5 @@
 ";"				{ ASCIIOP_RETURN(); }
 "."				{ ASCIIOP_RETURN(); }					// also operator
+"@@"			{ NAMEDOP_RETURN(ATTR); }				// CFA, attribute shorthand
 "..."			{ NAMEDOP_RETURN(ELLIPSIS); }
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 1d5e560193e4f0f7925e8e5df29a9b1f4638a344)
+++ src/Parser/parser.yy	(revision 647e2ea4f54e975bd697890e305f6c7f6d4e7462)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Feb 23 18:25:46 2024
-// Update Count     : 6484
+// Last Modified On : Mon Mar  4 08:44:25 2024
+// Update Count     : 6562
 //
 
@@ -126,5 +126,5 @@
 	DeclarationNode * cl = (new DeclarationNode)->addType( typeSpec ); // typeSpec IS DELETED!!!
 
-	// Start at second variable in declaration list and clone the type specifiers for each variable..
+	// Start at second variable in declaration list and clone the type specifiers for each variable.
 	for ( DeclarationNode * cur = dynamic_cast<DeclarationNode *>( declList->get_next() ); cur != nullptr; cur = dynamic_cast<DeclarationNode *>( cur->get_next() ) ) {
 		cl->cloneBaseType( cur, copyattr );				// cur is modified
@@ -389,5 +389,5 @@
 %token LE GE EQ NE										// <=	>=	==	!=
 %token ANDAND OROR										// &&	||
-%token ELLIPSIS											// ...
+%token ATTR ELLIPSIS									// @@	...
 
 %token EXPassign	MULTassign	DIVassign	MODassign	// \=	*=	/=	%=
@@ -433,5 +433,5 @@
 %type<stmt> statement					labeled_statement			compound_statement
 %type<stmt> statement_decl				statement_decl_list			statement_list_nodecl
-%type<stmt> selection_statement			if_statement
+%type<stmt> selection_statement
 %type<clause> switch_clause_list_opt	switch_clause_list
 %type<expr> case_value
@@ -500,5 +500,5 @@
 %type<decl> cfa_identifier_parameter_declarator_tuple cfa_identifier_parameter_ptr
 
-%type<decl> cfa_parameter_declaration cfa_parameter_list cfa_parameter_ellipsis_list_opt
+%type<decl> cfa_parameter_declaration cfa_parameter_list cfa_parameter_list_ellipsis_opt
 
 %type<decl> cfa_typedef_declaration cfa_variable_declaration cfa_variable_specifier
@@ -508,5 +508,5 @@
 %type<decl> KR_parameter_list KR_parameter_list_opt
 
-%type<decl> parameter_declaration parameter_list parameter_type_list_opt
+%type<decl> parameter_declaration parameter_list parameter_list_ellipsis_opt
 
 %type<decl> paren_identifier paren_type
@@ -530,5 +530,5 @@
 %type<decl> type_parameter type_parameter_list type_initializer_opt
 
-%type<expr> type_parameters_opt type_list array_type_list
+%type<expr> type_parameters_opt type_list array_type_list // array_dimension_list
 
 %type<decl> type_qualifier type_qualifier_name forall type_qualifier_list_opt type_qualifier_list
@@ -1246,9 +1246,16 @@
 	;
 
+// if, switch, and choose require parenthesis around the conditional because it can be followed by a statement.
+// For example, without parenthesis:
+//
+//    if x + y + z; => "if ( x + y ) + z" or "if ( x ) + y + z"
+//    switch ( S ) { ... } => switch ( S ) { compound literal... } ... or 
+
 selection_statement:
-			// pop causes a S/R conflict without separating the IF statement into a non-terminal even after resolving
-			// the inherent S/R conflict with THEN/ELSE.
-	push if_statement pop
-		{ $$ = $2; }
+	IF '(' conditional_declaration ')' statement		%prec THEN
+		// explicitly deal with the shift/reduce conflict on if/else
+		{ $$ = new StatementNode( build_if( yylloc, $3, maybe_build_compound( yylloc, $5 ), nullptr ) ); }
+	| IF '(' conditional_declaration ')' statement ELSE statement
+		{ $$ = new StatementNode( build_if( yylloc, $3, maybe_build_compound( yylloc, $5 ), maybe_build_compound( yylloc, $7 ) ) ); }
 	| SWITCH '(' comma_expression ')' case_clause
 		{ $$ = new StatementNode( build_switch( yylloc, true, $3, $5 ) ); }
@@ -1274,12 +1281,4 @@
 	| CHOOSE '(' comma_expression ')' '{' error '}'		// CFA, invalid syntax rule
 		{ SemanticError( yylloc, "syntax error, declarations can only appear before the list of case clauses." ); $$ = nullptr; }
-	;
-
-if_statement:
-	IF '(' conditional_declaration ')' statement		%prec THEN
-		// explicitly deal with the shift/reduce conflict on if/else
-		{ $$ = new StatementNode( build_if( yylloc, $3, maybe_build_compound( yylloc, $5 ), nullptr ) ); }
-	| IF '(' conditional_declaration ')' statement ELSE statement
-		{ $$ = new StatementNode( build_if( yylloc, $3, maybe_build_compound( yylloc, $5 ), maybe_build_compound( yylloc, $7 ) ) ); }
 	;
 
@@ -1897,5 +1896,6 @@
 declaration_list:
 	declaration
-	| declaration_list declaration		{ $$ = $1->set_last( $2 ); }
+	| declaration_list declaration
+		{ $$ = $1->set_last( $2 ); }
 	;
 
@@ -1990,5 +1990,5 @@
 	| declaration_qualifier_list type_qualifier_list cfa_function_specifier
 		{ $$ = $3->addQualifiers( $1 )->addQualifiers( $2 ); }
-	| cfa_function_declaration ',' identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')'
+	| cfa_function_declaration ',' identifier_or_type_name '(' push cfa_parameter_list_ellipsis_opt pop ')'
 		{
 			// Append the return type at the start (left-hand-side) to each identifier in the list.
@@ -2000,30 +2000,22 @@
 
 cfa_function_specifier:									// CFA
-//	'[' ']' identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' // S/R conflict
-//		{
-//			$$ = DeclarationNode::newFunction( $3, DeclarationNode::newTuple( 0 ), $6, nullptr, true );
-//		}
-//	'[' ']' identifier '(' push cfa_parameter_ellipsis_list_opt pop ')'
-//		{
-//			typedefTable.setNextIdentifier( *$5 );
-//			$$ = DeclarationNode::newFunction( $5, DeclarationNode::newTuple( 0 ), $8, nullptr, true );
-//		}
-//	| '[' ']' TYPEDEFname '(' push cfa_parameter_ellipsis_list_opt pop ')'
-//		{
-//			typedefTable.setNextIdentifier( *$5 );
-//			$$ = DeclarationNode::newFunction( $5, DeclarationNode::newTuple( 0 ), $8, nullptr, true );
-//		}
-//	| '[' ']' typegen_name
+	'[' ']' identifier '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt
+		{ $$ = DeclarationNode::newFunction( $3,  DeclarationNode::newTuple( nullptr ), $6, nullptr )->addQualifiers( $9 ); }
+	| '[' ']' TYPEDEFname '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt
+		{ $$ = DeclarationNode::newFunction( $3,  DeclarationNode::newTuple( nullptr ), $6, nullptr )->addQualifiers( $9 ); }
+	// | '[' ']' TYPEGENname '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt
+	// 	{ $$ = DeclarationNode::newFunction( $3,  DeclarationNode::newTuple( nullptr ), $6, nullptr )->addQualifiers( $9 ); }
+
 		// identifier_or_type_name must be broken apart because of the sequence:
 		//
-		//   '[' ']' identifier_or_type_name '(' cfa_parameter_ellipsis_list_opt ')'
+		//   '[' ']' identifier_or_type_name '(' cfa_parameter_list_ellipsis_opt ')'
 		//   '[' ']' type_specifier
 		//
 		// type_specifier can resolve to just TYPEDEFname (e.g., typedef int T; int f( T );). Therefore this must be
 		// flattened to allow lookahead to the '(' without having to reduce identifier_or_type_name.
-	cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' attribute_list_opt
+	| cfa_abstract_tuple identifier_or_type_name '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt
 		// To obtain LR(1 ), this rule must be factored out from function return type (see cfa_abstract_declarator).
 		{ $$ = DeclarationNode::newFunction( $2, $1, $5, nullptr )->addQualifiers( $8 ); }
-	| cfa_function_return identifier_or_type_name '(' push cfa_parameter_ellipsis_list_opt pop ')' attribute_list_opt
+	| cfa_function_return identifier_or_type_name '(' push cfa_parameter_list_ellipsis_opt pop ')' attribute_list_opt
 		{ $$ = DeclarationNode::newFunction( $2, $1, $5, nullptr )->addQualifiers( $8 ); }
 	;
@@ -2032,7 +2024,7 @@
 	'[' push cfa_parameter_list pop ']'
 		{ $$ = DeclarationNode::newTuple( $3 ); }
-	| '[' push cfa_parameter_list pop ',' push cfa_abstract_parameter_list pop ']'
+	| '[' push cfa_parameter_list ',' cfa_abstract_parameter_list pop ']'
 		// To obtain LR(1 ), the last cfa_abstract_parameter_list is added into this flattened rule to lookahead to the ']'.
-		{ $$ = DeclarationNode::newTuple( $3->set_last( $7 ) ); }
+		{ $$ = DeclarationNode::newTuple( $3->set_last( $5 ) ); }
 	;
 
@@ -2048,8 +2040,8 @@
 			$$ = $2->addTypedef();
 		}
-	| cfa_typedef_declaration pop ',' push identifier
-		{
-			typedefTable.addToEnclosingScope( *$5, TYPEDEFname, "cfa_typedef_declaration 3" );
-			$$ = $1->set_last( $1->cloneType( $5 ) );
+	| cfa_typedef_declaration ',' identifier
+		{
+			typedefTable.addToEnclosingScope( *$3, TYPEDEFname, "cfa_typedef_declaration 3" );
+			$$ = $1->set_last( $1->cloneType( $3 ) );
 		}
 	;
@@ -2691,4 +2683,8 @@
 	;
 
+// ***********
+// Enumeration
+// ***********
+
 enum_type:
 	ENUM attribute_list_opt '{' enumerator_list comma_opt '}'
@@ -2719,5 +2715,5 @@
 	| ENUM '(' cfa_abstract_parameter_declaration ')' attribute_list_opt identifier attribute_list_opt
 		{
-			if ( $3 && ($3->storageClasses.any() || $3->type->qualifiers.val != 0 )) {
+			if ( $3 && ($3->storageClasses.any() || $3->type->qualifiers.val != 0) ) {
 				SemanticError( yylloc, "syntax error, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." );
 			}
@@ -2789,38 +2785,9 @@
 	;
 
-cfa_parameter_ellipsis_list_opt:						// CFA, abstract + real
-	// empty
-		{ $$ = DeclarationNode::newBasicType( DeclarationNode::Void ); }
-	| ELLIPSIS
-		{ $$ = nullptr; }
-	| cfa_abstract_parameter_list
-	| cfa_parameter_list
-	| cfa_parameter_list pop ',' push cfa_abstract_parameter_list
-		{ $$ = $1->set_last( $5 ); }
-	| cfa_abstract_parameter_list pop ',' push ELLIPSIS
-		{ $$ = $1->addVarArgs(); }
-	| cfa_parameter_list pop ',' push ELLIPSIS
-		{ $$ = $1->addVarArgs(); }
-	;
-
-cfa_parameter_list:										// CFA
-		// To obtain LR(1) between cfa_parameter_list and cfa_abstract_tuple, the last cfa_abstract_parameter_list is
-		// factored out from cfa_parameter_list, flattening the rules to get lookahead to the ']'.
-	cfa_parameter_declaration
-	| cfa_abstract_parameter_list pop ',' push cfa_parameter_declaration
-		{ $$ = $1->set_last( $5 ); }
-	| cfa_parameter_list pop ',' push cfa_parameter_declaration
-		{ $$ = $1->set_last( $5 ); }
-	| cfa_parameter_list pop ',' push cfa_abstract_parameter_list pop ',' push cfa_parameter_declaration
-		{ $$ = $1->set_last( $5 )->set_last( $9 ); }
-	;
-
-cfa_abstract_parameter_list:							// CFA, new & old style abstract
-	cfa_abstract_parameter_declaration
-	| cfa_abstract_parameter_list pop ',' push cfa_abstract_parameter_declaration
-		{ $$ = $1->set_last( $5 ); }
-	;
-
-parameter_type_list_opt:
+// *******************
+// Function parameters
+// *******************
+
+parameter_list_ellipsis_opt:
 	// empty
 		{ $$ = nullptr; }
@@ -2833,9 +2800,42 @@
 
 parameter_list:											// abstract + real
-	abstract_parameter_declaration
-	| parameter_declaration
+	parameter_declaration
+	| abstract_parameter_declaration
+	| parameter_list ',' parameter_declaration
+		{ $$ = $1->set_last( $3 ); }
 	| parameter_list ',' abstract_parameter_declaration
 		{ $$ = $1->set_last( $3 ); }
-	| parameter_list ',' parameter_declaration
+	;
+
+cfa_parameter_list_ellipsis_opt:						// CFA, abstract + real
+	// empty
+		{ $$ = DeclarationNode::newBasicType( DeclarationNode::Void ); }
+	| ELLIPSIS
+		{ $$ = nullptr; }
+	| cfa_parameter_list
+	| cfa_abstract_parameter_list
+	| cfa_parameter_list ',' cfa_abstract_parameter_list
+		{ $$ = $1->set_last( $3 ); }
+	| cfa_parameter_list ',' ELLIPSIS
+		{ $$ = $1->addVarArgs(); }
+	| cfa_abstract_parameter_list ',' ELLIPSIS
+		{ $$ = $1->addVarArgs(); }
+	;
+
+cfa_parameter_list:										// CFA
+		// To obtain LR(1) between cfa_parameter_list and cfa_abstract_tuple, the last cfa_abstract_parameter_list is
+		// factored out from cfa_parameter_list, flattening the rules to get lookahead to the ']'.
+	cfa_parameter_declaration
+	| cfa_abstract_parameter_list ',' cfa_parameter_declaration
+		{ $$ = $1->set_last( $3 ); }
+	| cfa_parameter_list ',' cfa_parameter_declaration
+		{ $$ = $1->set_last( $3 ); }
+	| cfa_parameter_list ',' cfa_abstract_parameter_list ',' cfa_parameter_declaration
+		{ $$ = $1->set_last( $3 )->set_last( $5 ); }
+	;
+
+cfa_abstract_parameter_list:							// CFA, new & old style abstract
+	cfa_abstract_parameter_declaration
+	| cfa_abstract_parameter_list ',' cfa_abstract_parameter_declaration
 		{ $$ = $1->set_last( $3 ); }
 	;
@@ -2843,4 +2843,19 @@
 // Provides optional identifier names (abstract_declarator/variable_declarator), no initialization, different semantics
 // for typedef name by using type_parameter_redeclarator instead of typedef_redeclarator, and function prototypes.
+
+parameter_declaration:
+		// No SUE declaration in parameter list.
+	declaration_specifier_nobody identifier_parameter_declarator default_initializer_opt
+		{ $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
+	| declaration_specifier_nobody type_parameter_redeclarator default_initializer_opt
+		{ $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
+	;
+
+abstract_parameter_declaration:
+	declaration_specifier_nobody default_initializer_opt
+		{ $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
+	| declaration_specifier_nobody abstract_parameter_declarator default_initializer_opt
+		{ $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
+	;
 
 cfa_parameter_declaration:								// CFA, new & old style parameter declaration
@@ -2864,19 +2879,4 @@
 		{ $$ = $2->addQualifiers( $1 ); }
 	| cfa_abstract_function
-	;
-
-parameter_declaration:
-		// No SUE declaration in parameter list.
-	declaration_specifier_nobody identifier_parameter_declarator default_initializer_opt
-		{ $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
-	| declaration_specifier_nobody type_parameter_redeclarator default_initializer_opt
-		{ $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
-	;
-
-abstract_parameter_declaration:
-	declaration_specifier_nobody default_initializer_opt
-		{ $$ = $1->addInitializer( $2 ? new InitializerNode( $2 ) : nullptr ); }
-	| declaration_specifier_nobody abstract_parameter_declarator default_initializer_opt
-		{ $$ = $2->addType( $1 )->addInitializer( $3 ? new InitializerNode( $3 ) : nullptr ); }
 	;
 
@@ -3395,4 +3395,8 @@
 	ATTRIBUTE '(' '(' attribute_name_list ')' ')'
 		{ $$ = $4; }
+	| ATTRIBUTE '(' attribute_name_list ')'				// CFA
+		{ $$ = $3; }
+	| ATTR '(' attribute_name_list ')'					// CFA
+		{ $$ = $3; }
 	;
 
@@ -3499,7 +3503,7 @@
 
 variable_function:
-	'(' variable_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	'(' variable_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $2->addParamList( $5 ); }
-	| '(' attribute_list variable_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	| '(' attribute_list variable_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
 	| '(' variable_function ')'							// redundant parenthesis
@@ -3522,9 +3526,9 @@
 
 function_no_ptr:
-	paren_identifier '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	paren_identifier '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $1->addParamList( $3 ); }
-	| '(' function_ptr ')' '(' parameter_type_list_opt ')'
+	| '(' function_ptr ')' '(' parameter_list_ellipsis_opt ')'
 		{ $$ = $2->addParamList( $5 ); }
-	| '(' attribute_list function_ptr ')' '(' parameter_type_list_opt ')'
+	| '(' attribute_list function_ptr ')' '(' parameter_list_ellipsis_opt ')'
 		{ $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
 	| '(' function_no_ptr ')'							// redundant parenthesis
@@ -3576,7 +3580,7 @@
 	paren_identifier '(' identifier_list ')'			// function_declarator handles empty parameter
 		{ $$ = $1->addIdList( $3 ); }
-	| '(' KR_function_ptr ')' '(' parameter_type_list_opt ')'
+	| '(' KR_function_ptr ')' '(' parameter_list_ellipsis_opt ')'
 		{ $$ = $2->addParamList( $5 ); }
-	| '(' attribute_list KR_function_ptr ')' '(' parameter_type_list_opt ')'
+	| '(' attribute_list KR_function_ptr ')' '(' parameter_list_ellipsis_opt ')'
 		{ $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
 	| '(' KR_function_no_ptr ')'						// redundant parenthesis
@@ -3668,7 +3672,7 @@
 
 variable_type_function:
-	'(' variable_type_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	'(' variable_type_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $2->addParamList( $5 ); }
-	| '(' attribute_list variable_type_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	| '(' attribute_list variable_type_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
 	| '(' variable_type_function ')'					// redundant parenthesis
@@ -3691,9 +3695,9 @@
 
 function_type_no_ptr:
-	paren_type '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	paren_type '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $1->addParamList( $3 ); }
-	| '(' function_type_ptr ')' '(' parameter_type_list_opt ')'
+	| '(' function_type_ptr ')' '(' parameter_list_ellipsis_opt ')'
 		{ $$ = $2->addParamList( $5 ); }
-	| '(' attribute_list function_type_ptr ')' '(' parameter_type_list_opt ')'
+	| '(' attribute_list function_type_ptr ')' '(' parameter_list_ellipsis_opt ')'
 		{ $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
 	| '(' function_type_no_ptr ')'						// redundant parenthesis
@@ -3738,5 +3742,6 @@
 		{ $$ = $1->addQualifiers( $2 ); }
 	| '&' MUTEX paren_identifier attribute_list_opt
-		{ $$ = $3->addPointer( DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( ast::CV::Mutex ), OperKinds::AddressOf ) )->addQualifiers( $4 ); }
+		{ $$ = $3->addPointer( DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( ast::CV::Mutex ),
+															OperKinds::AddressOf ) )->addQualifiers( $4 ); }
 	| identifier_parameter_ptr
 	| identifier_parameter_array attribute_list_opt
@@ -3767,7 +3772,7 @@
 
 identifier_parameter_function:
-	paren_identifier '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	paren_identifier '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $1->addParamList( $3 ); }
-	| '(' identifier_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	| '(' identifier_parameter_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $2->addParamList( $5 ); }
 	| '(' identifier_parameter_function ')'				// redundant parenthesis
@@ -3788,5 +3793,6 @@
 		{ $$ = $1->addQualifiers( $2 ); }
 	| '&' MUTEX typedef_name attribute_list_opt
-		{ $$ = $3->addPointer( DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( ast::CV::Mutex ), OperKinds::AddressOf ) )->addQualifiers( $4 ); }
+		{ $$ = $3->addPointer( DeclarationNode::newPointer( DeclarationNode::newTypeQualifier( ast::CV::Mutex ),
+															OperKinds::AddressOf ) )->addQualifiers( $4 ); }
 	| type_parameter_ptr
 	| type_parameter_array attribute_list_opt
@@ -3820,7 +3826,7 @@
 
 type_parameter_function:
-	typedef_name '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	typedef_name '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $1->addParamList( $3 ); }
-	| '(' type_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	| '(' type_parameter_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $2->addParamList( $5 ); }
 	;
@@ -3870,7 +3876,7 @@
 
 abstract_function:
-	'(' parameter_type_list_opt ')'			// empty parameter list OBSOLESCENT (see 3)
+	'(' parameter_list_ellipsis_opt ')'			// empty parameter list OBSOLESCENT (see 3)
 		{ $$ = DeclarationNode::newFunction( nullptr, nullptr, $2, nullptr ); }
-	| '(' abstract_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	| '(' abstract_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $2->addParamList( $5 ); }
 	| '(' abstract_function ')'							// redundant parenthesis
@@ -3888,8 +3894,17 @@
 		{ $$ = DeclarationNode::newArray( $3, nullptr, false )->addArray( DeclarationNode::newArray( $6, nullptr, false ) ); }
 		// { SemanticError( yylloc, "New array dimension is currently unimplemented." ); $$ = nullptr; }
+
+		// If needed, the following parses and does not use comma_expression, so the array structure can be built.
+	// | '[' push assignment_expression pop ',' push array_dimension_list pop ']' // CFA
+
 	| '[' push array_type_list pop ']'					// CFA
 		{ $$ = DeclarationNode::newArray( $3, nullptr, false ); }
 	| multi_array_dimension
 	;
+
+// array_dimension_list:
+// 	assignment_expression
+// 	| array_dimension_list ',' assignment_expression
+// 	;
 
 array_type_list:
@@ -3993,7 +4008,7 @@
 
 abstract_parameter_function:
-	'(' parameter_type_list_opt ')'			// empty parameter list OBSOLESCENT (see 3)
+	'(' parameter_list_ellipsis_opt ')'			// empty parameter list OBSOLESCENT (see 3)
 		{ $$ = DeclarationNode::newFunction( nullptr, nullptr, $2, nullptr ); }
-	| '(' abstract_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	| '(' abstract_parameter_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $2->addParamList( $5 ); }
 	| '(' abstract_parameter_function ')'				// redundant parenthesis
@@ -4072,5 +4087,5 @@
 
 variable_abstract_function:
-	'(' variable_abstract_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+	'(' variable_abstract_ptr ')' '(' parameter_list_ellipsis_opt ')' // empty parameter list OBSOLESCENT (see 3)
 		{ $$ = $2->addParamList( $5 ); }
 	| '(' variable_abstract_function ')'				// redundant parenthesis
@@ -4158,5 +4173,5 @@
 //
 //		cfa_abstract_tuple identifier_or_type_name
-//		'[' cfa_parameter_list ']' identifier_or_type_name '(' cfa_parameter_ellipsis_list_opt ')'
+//		'[' cfa_parameter_list ']' identifier_or_type_name '(' cfa_parameter_list_ellipsis_opt ')'
 //
 // since a function return type can be syntactically identical to a tuple type:
@@ -4224,9 +4239,9 @@
 
 cfa_abstract_function:									// CFA
-//	'[' ']' '(' cfa_parameter_ellipsis_list_opt ')'
-//		{ $$ = DeclarationNode::newFunction( nullptr, DeclarationNode::newTuple( nullptr ), $4, nullptr ); }
-	cfa_abstract_tuple '(' push cfa_parameter_ellipsis_list_opt pop ')'
+	'[' ']' '(' cfa_parameter_list_ellipsis_opt ')'
+		{ $$ = DeclarationNode::newFunction( nullptr, DeclarationNode::newTuple( nullptr ), $4, nullptr ); }
+	| cfa_abstract_tuple '(' push cfa_parameter_list_ellipsis_opt pop ')'
 		{ $$ = DeclarationNode::newFunction( nullptr, $1, $4, nullptr ); }
-	| cfa_function_return '(' push cfa_parameter_ellipsis_list_opt pop ')'
+	| cfa_function_return '(' push cfa_parameter_list_ellipsis_opt pop ')'
 		{ $$ = DeclarationNode::newFunction( nullptr, $1, $4, nullptr ); }
 	;
