Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision e1990f17e789f12bf9f41002c6044c5ad71db28e)
+++ src/Parser/parser.yy	(revision e307e12f8cb3e70b7a3e22f11583c9e108c0e472)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug  4 21:48:23 2019
-// Update Count     : 4364
+// Last Modified On : Sat Dec  7 10:43:44 2019
+// Update Count     : 4394
 //
 
@@ -211,4 +211,15 @@
 } // forCtrl
 
+KeywordCastExpr::Target Aggregate2Target( DeclarationNode::Aggregate aggr ) {
+	KeywordCastExpr::Target target;
+	switch ( aggr ) {
+	  case DeclarationNode::Coroutine: target = KeywordCastExpr::Coroutine; break;
+	  case DeclarationNode::Monitor: target = KeywordCastExpr::Monitor; break;
+	  case DeclarationNode::Thread: target = KeywordCastExpr::Thread; break;
+	  default: abort();
+	} // switch
+	return target;
+} // Aggregate2Target
+
 
 bool forall = false, yyy = false;						// aggregate have one or more forall qualifiers ?
@@ -365,5 +376,5 @@
 %type<decl> abstract_parameter_declaration
 
-%type<aggKey> aggregate_key
+%type<aggKey> aggregate_key aggregate_data aggregate_control
 %type<decl> aggregate_type aggregate_type_nobody
 
@@ -650,4 +661,6 @@
 	| postfix_expression '.' '[' field_name_list ']'	// CFA, tuple field selector
 		{ $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $4 ) ) ); }
+	| postfix_expression '.' aggregate_control
+		{ $$ = new ExpressionNode( build_keyword_cast( Aggregate2Target( $3 ), $1 ) ); }
 	| postfix_expression ARROW identifier
 		{ $$ = new ExpressionNode( build_pfieldSel( $1, build_varref( $3 ) ) ); }
@@ -793,13 +806,6 @@
 	| '(' type_no_function ')' cast_expression
 		{ $$ = new ExpressionNode( build_cast( $2, $4 ) ); }
-		// keyword cast cannot be grouped because of reduction in aggregate_key
-	| '(' GENERATOR '&' ')' cast_expression				// CFA
-		{ $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Coroutine, $5 ) ); }
-	| '(' COROUTINE '&' ')' cast_expression				// CFA
-		{ $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Coroutine, $5 ) ); }
-	| '(' THREAD '&' ')' cast_expression				// CFA
-		{ $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Thread, $5 ) ); }
-	| '(' MONITOR '&' ')' cast_expression				// CFA
-		{ $$ = new ExpressionNode( build_keyword_cast( KeywordCastExpr::Monitor, $5 ) ); }
+	| '(' aggregate_control '&' ')' cast_expression		// CFA
+		{ $$ = new ExpressionNode( build_keyword_cast( Aggregate2Target( $2 ), $5 ) ); }
 		// VIRTUAL cannot be opt because of look ahead issues
 	| '(' VIRTUAL ')' cast_expression					// CFA
@@ -2059,11 +2065,19 @@
 
 aggregate_key:
+	aggregate_data
+	| aggregate_control
+	;
+
+aggregate_data:
 	STRUCT
 		{ yyy = true; $$ = DeclarationNode::Struct; }
 	| UNION
 		{ yyy = true; $$ = DeclarationNode::Union; }
-	| EXCEPTION
+	| EXCEPTION											// CFA
 		{ yyy = true; $$ = DeclarationNode::Exception; }
-	| GENERATOR
+	;
+
+aggregate_control:										// CFA
+	GENERATOR
 		{ yyy = true; $$ = DeclarationNode::Coroutine; }
 	| COROUTINE
@@ -2096,4 +2110,6 @@
 			distInl( $3 );
 		}
+	| INLINE aggregate_control ';'						// CFA
+	   	{ SemanticError( yylloc, "INLINE aggregate control currently unimplemented." ); $$ = nullptr; }
 	| typedef_declaration ';'							// CFA
 	| cfa_field_declaring_list ';'						// CFA, new style field declaration
