Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision d7874052137a775445ae25caefc2846ed4a3a9fd)
+++ src/Parser/parser.yy	(revision 71a422a1d8893f433b93127c960646a81ce991cd)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Jun 30 12:32:36 2023
-// Update Count     : 6364
+// Last Modified On : Wed Jul 12 06:14:16 2023
+// Update Count     : 6382
 //
 
@@ -385,24 +385,24 @@
 %type<str> string_literal_list
 
-%type<enum_hiding> hide_opt					visible_hide_opt
+%type<enum_hiding> hide_opt				visible_hide_opt
 
 // expressions
 %type<expr> constant
-%type<expr> tuple							tuple_expression_list
+%type<expr> tuple						tuple_expression_list
 %type<oper> ptrref_operator				unary_operator				assignment_operator			simple_assignment_operator	compound_assignment_operator
 %type<expr> primary_expression			postfix_expression			unary_expression
-%type<expr> cast_expression_list			cast_expression				exponential_expression		multiplicative_expression	additive_expression
-%type<expr> shift_expression				relational_expression		equality_expression
+%type<expr> cast_expression_list		cast_expression				exponential_expression		multiplicative_expression	additive_expression
+%type<expr> shift_expression			relational_expression		equality_expression
 %type<expr> AND_expression				exclusive_OR_expression		inclusive_OR_expression
 %type<expr> logical_AND_expression		logical_OR_expression
 %type<expr> conditional_expression		constant_expression			assignment_expression		assignment_expression_opt
-%type<expr> comma_expression				comma_expression_opt
-%type<expr> argument_expression_list_opt	argument_expression_list	argument_expression			default_initializer_opt
+%type<expr> comma_expression			comma_expression_opt
+%type<expr> argument_expression_list_opt argument_expression_list	argument_expression			default_initializer_opt
 %type<ifctl> conditional_declaration
-%type<forctl> for_control_expression		for_control_expression_list
+%type<forctl> for_control_expression	for_control_expression_list
 %type<oper> upupeq updown updowneq downupdowneq
 %type<expr> subrange
 %type<decl> asm_name_opt
-%type<expr> asm_operands_opt				asm_operands_list			asm_operand
+%type<expr> asm_operands_opt			asm_operands_list			asm_operand
 %type<labels> label_list
 %type<expr> asm_clobbers_list_opt
@@ -412,12 +412,12 @@
 
 // statements
-%type<stmt> statement						labeled_statement			compound_statement
+%type<stmt> statement					labeled_statement			compound_statement
 %type<stmt> statement_decl				statement_decl_list			statement_list_nodecl
 %type<stmt> selection_statement			if_statement
-%type<clause> switch_clause_list_opt		switch_clause_list
+%type<clause> switch_clause_list_opt	switch_clause_list
 %type<expr> case_value
-%type<clause> case_clause				case_value_list				case_label					case_label_list
+%type<clause> case_clause				case_value_list				case_label	case_label_list
 %type<stmt> iteration_statement			jump_statement
-%type<stmt> expression_statement			asm_statement
+%type<stmt> expression_statement		asm_statement
 %type<stmt> with_statement
 %type<expr> with_clause_opt
@@ -427,5 +427,5 @@
 %type<stmt> mutex_statement
 %type<expr> when_clause					when_clause_opt				waitfor		waituntil		timeout
-%type<stmt> waitfor_statement				waituntil_statement
+%type<stmt> waitfor_statement			waituntil_statement
 %type<wfs> wor_waitfor_clause
 %type<wucn> waituntil_clause			wand_waituntil_clause       wor_waituntil_clause
@@ -601,5 +601,5 @@
 // around the list separator.
 //
-//  int f( forall(T) T (*f1) T , forall( S ) S (*f2)( S ) );
+//  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 //      push               pop   push                   pop
 
@@ -1715,7 +1715,7 @@
 	| wor_waituntil_clause wor when_clause_opt timeout statement wor when_clause ELSE statement
 		{ $$ = new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::LEFT_OR, $1,
-                new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::OR, 
-                    build_waituntil_timeout( yylloc, $3, $4, maybe_build_compound( yylloc, $5 ) ), 
-                    build_waituntil_else( yylloc, $7, maybe_build_compound( yylloc, $9 ) ) ) ); }
+				new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::OR, 
+					build_waituntil_timeout( yylloc, $3, $4, maybe_build_compound( yylloc, $5 ) ), 
+					build_waituntil_else( yylloc, $7, maybe_build_compound( yylloc, $9 ) ) ) ); }
 	;
 
@@ -1724,7 +1724,7 @@
 		// SKULLDUGGERY: create an empty compound statement to test parsing of waituntil statement.
 		{
-            $$ = new StatementNode( build_waituntil_stmt( yylloc, $1 ) );
-            // $$ = new StatementNode( build_compound( yylloc, nullptr ) );
-        }
+			$$ = new StatementNode( build_waituntil_stmt( yylloc, $1 ) );
+			// $$ = new StatementNode( build_compound( yylloc, nullptr ) );
+		}
 	;
 
@@ -2007,15 +2007,15 @@
 	TYPEDEF cfa_variable_specifier
 		{
-			typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname, "1" );
+			typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname, "cfa_typedef_declaration 1" );
 			$$ = $2->addTypedef();
 		}
 	| TYPEDEF cfa_function_specifier
 		{
-			typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname, "2" );
+			typedefTable.addToEnclosingScope( *$2->name, TYPEDEFname, "cfa_typedef_declaration 2" );
 			$$ = $2->addTypedef();
 		}
 	| cfa_typedef_declaration pop ',' push identifier
 		{
-			typedefTable.addToEnclosingScope( *$5, TYPEDEFname, "3" );
+			typedefTable.addToEnclosingScope( *$5, TYPEDEFname, "cfa_typedef_declaration 3" );
 			$$ = $1->appendList( $1->cloneType( $5 ) );
 		}
@@ -2028,5 +2028,5 @@
 	TYPEDEF type_specifier declarator
 		{
-			typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "4" );
+			typedefTable.addToEnclosingScope( *$3->name, TYPEDEFname, "typedef_declaration 1" );
 			if ( $2->type->forall || ($2->type->kind == TypeData::Aggregate && $2->type->aggregate.params) ) {
 				SemanticError( yylloc, "forall qualifier in typedef is currently unimplemented." ); $$ = nullptr;
@@ -2035,5 +2035,5 @@
 	| typedef_declaration pop ',' push declarator
 		{
-			typedefTable.addToEnclosingScope( *$5->name, TYPEDEFname, "5" );
+			typedefTable.addToEnclosingScope( *$5->name, TYPEDEFname, "typedef_declaration 2" );
 			$$ = $1->appendList( $1->cloneBaseType( $5 )->addTypedef() );
 		}
@@ -2465,5 +2465,5 @@
 	| aggregate_key attribute_list_opt identifier
 		{
-			typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef
+			typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname, "aggregate_type: 1" );
 			forall = false;								// reset
 		}
@@ -2474,5 +2474,5 @@
 	| aggregate_key attribute_list_opt TYPEDEFname		// unqualified type name
 		{
-			typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef
+			typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname, "aggregate_type: 2" );
 			forall = false;								// reset
 		}
@@ -2484,5 +2484,5 @@
 	| aggregate_key attribute_list_opt TYPEGENname		// unqualified type name
 		{
-			typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname ); // create typedef
+			typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname, "aggregate_type: 3" );
 			forall = false;								// reset
 		}
@@ -2505,5 +2505,5 @@
 	aggregate_key attribute_list_opt identifier
 		{
-			typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname );
+			typedefTable.makeTypedef( *$3, forall || typedefTable.getEnclForall() ? TYPEGENname : TYPEDEFname, "aggregate_type_nobody" );
 			forall = false;								// reset
 			$$ = DeclarationNode::newAggregate( $1, $3, nullptr, nullptr, false )->addQualifiers( $2 );
@@ -2683,5 +2683,5 @@
 		{ SemanticError( yylloc, "syntax error, hiding '!' the enumerator names of an anonymous enumeration means the names are inaccessible." ); $$ = nullptr; }
 	| ENUM attribute_list_opt identifier
-		{ typedefTable.makeTypedef( *$3 ); }
+		{ typedefTable.makeTypedef( *$3, "enum_type 1" ); }
 	  hide_opt '{' enumerator_list comma_opt '}'
 		{ $$ = DeclarationNode::newEnum( $3, $7, true, false, nullptr, $5 )->addQualifiers( $2 ); }
@@ -2708,5 +2708,5 @@
 				SemanticError( yylloc, "syntax error, storage-class and CV qualifiers are not meaningful for enumeration constants, which are const." );
 			}
-			typedefTable.makeTypedef( *$6 );
+			typedefTable.makeTypedef( *$6, "enum_type 2" );
 		}
 	  hide_opt '{' enumerator_list comma_opt '}'
@@ -2738,7 +2738,13 @@
 enum_type_nobody:										// enum - {...}
 	ENUM attribute_list_opt identifier
-		{ typedefTable.makeTypedef( *$3 ); $$ = DeclarationNode::newEnum( $3, nullptr, false, false )->addQualifiers( $2 ); }
+		{
+			typedefTable.makeTypedef( *$3, "enum_type_nobody 1" );
+			$$ = DeclarationNode::newEnum( $3, nullptr, false, false )->addQualifiers( $2 );
+		}
 	| ENUM attribute_list_opt type_name
-		{ typedefTable.makeTypedef( *$3->type->symbolic.name );	$$ = DeclarationNode::newEnum( $3->type->symbolic.name, nullptr, false, false )->addQualifiers( $2 ); }
+		{
+			typedefTable.makeTypedef( *$3->type->symbolic.name, "enum_type_nobody 2" );
+			$$ = DeclarationNode::newEnum( $3->type->symbolic.name, nullptr, false, false )->addQualifiers( $2 );
+		}
 	;
 
@@ -2808,5 +2814,5 @@
 		{ $$ = nullptr; }
 	| parameter_list
-	| parameter_list pop ',' push ELLIPSIS
+	| parameter_list ',' ELLIPSIS
 		{ $$ = $1->addVarArgs(); }
 	;
@@ -2815,8 +2821,8 @@
 	abstract_parameter_declaration
 	| parameter_declaration
-	| parameter_list pop ',' push abstract_parameter_declaration
-		{ $$ = $1->appendList( $5 ); }
-	| parameter_list pop ',' push parameter_declaration
-		{ $$ = $1->appendList( $5 ); }
+	| parameter_list ',' abstract_parameter_declaration
+		{ $$ = $1->appendList( $3 ); }
+	| parameter_list ',' parameter_declaration
+		{ $$ = $1->appendList( $3 ); }
 	;
 
@@ -2983,5 +2989,5 @@
 	type_class identifier_or_type_name
 		{
-			typedefTable.addToScope( *$2, TYPEDEFname, "9" );
+			typedefTable.addToScope( *$2, TYPEDEFname, "type_parameter 1" );
 			if ( $1 == ast::TypeDecl::Otype ) { SemanticError( yylloc, "otype keyword is deprecated, use T " ); }
 			if ( $1 == ast::TypeDecl::Dtype ) { SemanticError( yylloc, "dtype keyword is deprecated, use T &" ); }
@@ -2991,10 +2997,10 @@
 		{ $$ = DeclarationNode::newTypeParam( $1, $2 )->addTypeInitializer( $4 )->addAssertions( $5 ); }
 	| identifier_or_type_name new_type_class
-		{ typedefTable.addToScope( *$1, TYPEDEFname, "9" ); }
+		{ typedefTable.addToScope( *$1, TYPEDEFname, "type_parameter 2" ); }
 	  type_initializer_opt assertion_list_opt
 		{ $$ = DeclarationNode::newTypeParam( $2, $1 )->addTypeInitializer( $4 )->addAssertions( $5 ); }
 	| '[' identifier_or_type_name ']'
 		{
-			typedefTable.addToScope( *$2, TYPEDIMname, "9" );
+			typedefTable.addToScope( *$2, TYPEDIMname, "type_parameter 3" );
 			$$ = DeclarationNode::newTypeParam( ast::TypeDecl::Dimension, $2 );
 		}
@@ -3078,10 +3084,10 @@
 	identifier_or_type_name
 		{
-			typedefTable.addToEnclosingScope( *$1, TYPEDEFname, "10" );
+			typedefTable.addToEnclosingScope( *$1, TYPEDEFname, "type_declarator_name 1" );
 			$$ = DeclarationNode::newTypeDecl( $1, nullptr );
 		}
 	| identifier_or_type_name '(' type_parameter_list ')'
 		{
-			typedefTable.addToEnclosingScope( *$1, TYPEGENname, "11" );
+			typedefTable.addToEnclosingScope( *$1, TYPEGENname, "type_declarator_name 2" );
 			$$ = DeclarationNode::newTypeDecl( $1, $3 );
 		}
@@ -3472,8 +3478,8 @@
 
 variable_function:
-	'(' variable_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $6 ); }
-	| '(' attribute_list variable_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
+	'(' variable_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $2->addParamList( $5 ); }
+	| '(' attribute_list variable_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
 	| '(' variable_function ')'							// redundant parenthesis
 		{ $$ = $2; }
@@ -3495,10 +3501,10 @@
 
 function_no_ptr:
-	paren_identifier '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $1->addParamList( $4 ); }
-	| '(' function_ptr ')' '(' push parameter_type_list_opt pop ')'
-		{ $$ = $2->addParamList( $6 ); }
-	| '(' attribute_list function_ptr ')' '(' push parameter_type_list_opt pop ')'
-		{ $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
+	paren_identifier '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $1->addParamList( $3 ); }
+	| '(' function_ptr ')' '(' parameter_type_list_opt ')'
+		{ $$ = $2->addParamList( $5 ); }
+	| '(' attribute_list function_ptr ')' '(' parameter_type_list_opt ')'
+		{ $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
 	| '(' function_no_ptr ')'							// redundant parenthesis
 		{ $$ = $2; }
@@ -3549,8 +3555,8 @@
 	paren_identifier '(' identifier_list ')'			// function_declarator handles empty parameter
 		{ $$ = $1->addIdList( $3 ); }
-	| '(' KR_function_ptr ')' '(' push parameter_type_list_opt pop ')'
-		{ $$ = $2->addParamList( $6 ); }
-	| '(' attribute_list KR_function_ptr ')' '(' push parameter_type_list_opt pop ')'
-		{ $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
+	| '(' KR_function_ptr ')' '(' parameter_type_list_opt ')'
+		{ $$ = $2->addParamList( $5 ); }
+	| '(' attribute_list KR_function_ptr ')' '(' parameter_type_list_opt ')'
+		{ $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
 	| '(' KR_function_no_ptr ')'						// redundant parenthesis
 		{ $$ = $2; }
@@ -3596,5 +3602,5 @@
 		{
 			// hide type name in enclosing scope by variable name
-			typedefTable.addToEnclosingScope( *$1->name, IDENTIFIER, "ID" );
+			typedefTable.addToEnclosingScope( *$1->name, IDENTIFIER, "paren_type" );
 		}
 	| '(' paren_type ')'
@@ -3641,8 +3647,8 @@
 
 variable_type_function:
-	'(' variable_type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $6 ); }
-	| '(' attribute_list variable_type_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
+	'(' variable_type_ptr ')' '(' parameter_type_list_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)
+		{ $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
 	| '(' variable_type_function ')'					// redundant parenthesis
 		{ $$ = $2; }
@@ -3664,10 +3670,10 @@
 
 function_type_no_ptr:
-	paren_type '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $1->addParamList( $4 ); }
-	| '(' function_type_ptr ')' '(' push parameter_type_list_opt pop ')'
-		{ $$ = $2->addParamList( $6 ); }
-	| '(' attribute_list function_type_ptr ')' '(' push parameter_type_list_opt pop ')'
-		{ $$ = $3->addQualifiers( $2 )->addParamList( $7 ); }
+	paren_type '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $1->addParamList( $3 ); }
+	| '(' function_type_ptr ')' '(' parameter_type_list_opt ')'
+		{ $$ = $2->addParamList( $5 ); }
+	| '(' attribute_list function_type_ptr ')' '(' parameter_type_list_opt ')'
+		{ $$ = $3->addQualifiers( $2 )->addParamList( $6 ); }
 	| '(' function_type_no_ptr ')'						// redundant parenthesis
 		{ $$ = $2; }
@@ -3740,8 +3746,8 @@
 
 identifier_parameter_function:
-	paren_identifier '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $1->addParamList( $4 ); }
-	| '(' identifier_parameter_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $6 ); }
+	paren_identifier '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $1->addParamList( $3 ); }
+	| '(' identifier_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $2->addParamList( $5 ); }
 	| '(' identifier_parameter_function ')'				// redundant parenthesis
 		{ $$ = $2; }
@@ -3793,8 +3799,8 @@
 
 type_parameter_function:
-	typedef_name '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $1->addParamList( $4 ); }
-	| '(' type_parameter_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $6 ); }
+	typedef_name '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $1->addParamList( $3 ); }
+	| '(' type_parameter_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $2->addParamList( $5 ); }
 	;
 
@@ -3843,8 +3849,8 @@
 
 abstract_function:
-	'(' push parameter_type_list_opt pop ')'			// empty parameter list OBSOLESCENT (see 3)
-		{ $$ = DeclarationNode::newFunction( nullptr, nullptr, $3, nullptr ); }
-	| '(' abstract_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $6 ); }
+	'(' parameter_type_list_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)
+		{ $$ = $2->addParamList( $5 ); }
 	| '(' abstract_function ')'							// redundant parenthesis
 		{ $$ = $2; }
@@ -3966,8 +3972,8 @@
 
 abstract_parameter_function:
-	'(' push parameter_type_list_opt pop ')'			// empty parameter list OBSOLESCENT (see 3)
-		{ $$ = DeclarationNode::newFunction( nullptr, nullptr, $3, nullptr ); }
-	| '(' abstract_parameter_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $6 ); }
+	'(' parameter_type_list_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)
+		{ $$ = $2->addParamList( $5 ); }
 	| '(' abstract_parameter_function ')'				// redundant parenthesis
 		{ $$ = $2; }
@@ -4006,10 +4012,10 @@
 // This pattern parses a declaration of an abstract variable, but does not allow "int ()" for a function pointer.
 //
-//		struct S {
-//          int;
-//          int *;
-//          int [10];
-//          int (*)();
-//      };
+//   struct S {
+//       int;
+//       int *;
+//       int [10];
+//       int (*)();
+//   };
 
 variable_abstract_declarator:
@@ -4045,6 +4051,6 @@
 
 variable_abstract_function:
-	'(' variable_abstract_ptr ')' '(' push parameter_type_list_opt pop ')' // empty parameter list OBSOLESCENT (see 3)
-		{ $$ = $2->addParamList( $6 ); }
+	'(' variable_abstract_ptr ')' '(' parameter_type_list_opt ')' // empty parameter list OBSOLESCENT (see 3)
+		{ $$ = $2->addParamList( $5 ); }
 	| '(' variable_abstract_function ')'				// redundant parenthesis
 		{ $$ = $2; }
