Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
+++ src/Parser/ParseNode.h	(revision 427854baeaba2d97cb23623b6d3c3ad7f7b0dbdd)
@@ -428,4 +428,5 @@
 Statement * build_asm( bool voltile, Expression * instruction, ExpressionNode * output = nullptr, ExpressionNode * input = nullptr, ExpressionNode * clobber = nullptr, LabelNode * gotolabels = nullptr );
 Statement * build_directive( std::string * directive );
+SuspendStmt * build_suspend( StatementNode *, SuspendStmt::Type = SuspendStmt::None);
 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when );
 WaitForStmt * build_waitfor( ExpressionNode * target, StatementNode * stmt, ExpressionNode * when, WaitForStmt * existing );
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
+++ src/Parser/StatementNode.cc	(revision 427854baeaba2d97cb23623b6d3c3ad7f7b0dbdd)
@@ -249,4 +249,19 @@
 } // build_finally
 
+SuspendStmt * build_suspend( StatementNode * then, SuspendStmt::Type type ) {
+	auto node = new SuspendStmt();
+
+	node->type = type;
+
+	std::list< Statement * > stmts;
+	buildMoveList< Statement, StatementNode >( then, stmts );
+	if(!stmts.empty()) {
+		assert( stmts.size() == 1 );
+		node->then = dynamic_cast< CompoundStmt * >( stmts.front() );
+	}
+
+	return node;
+}
+
 WaitForStmt * build_waitfor( ExpressionNode * targetExpr, StatementNode * stmt, ExpressionNode * when ) {
 	auto node = new WaitForStmt();
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
+++ src/Parser/TypeData.cc	(revision 427854baeaba2d97cb23623b6d3c3ad7f7b0dbdd)
@@ -769,4 +769,5 @@
 	  case AggregateDecl::Struct:
 	  case AggregateDecl::Coroutine:
+	  case AggregateDecl::Generator:
 	  case AggregateDecl::Monitor:
 	  case AggregateDecl::Thread:
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 37cdd97f319c512b8374d214748e986930e2e8f8)
+++ src/Parser/parser.yy	(revision 427854baeaba2d97cb23623b6d3c3ad7f7b0dbdd)
@@ -1261,15 +1261,15 @@
 		{ SemanticError( yylloc, "Initializer return is currently unimplemented." ); $$ = nullptr; }
 	| SUSPEND ';'
-	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = new StatementNode( build_suspend( nullptr ) ); }
 	| SUSPEND compound_statement ';'
-	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = new StatementNode( build_suspend( $2 ) ); }
 	| SUSPEND COROUTINE ';'
-	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = new StatementNode( build_suspend( nullptr, SuspendStmt::Coroutine ) ); }
 	| SUSPEND COROUTINE compound_statement
-	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = new StatementNode( build_suspend( $3, SuspendStmt::Coroutine ) ); }
 	| SUSPEND GENERATOR ';'
-	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = new StatementNode( build_suspend( nullptr, SuspendStmt::Generator ) ); }
 	| SUSPEND GENERATOR compound_statement
-	  	{ SemanticError( yylloc, "Suspend expression is currently unimplemented." ); $$ = nullptr; }
+		{ $$ = new StatementNode( build_suspend( $3, SuspendStmt::Generator ) ); }
 	| THROW assignment_expression_opt ';'				// handles rethrow
 		{ $$ = new StatementNode( build_throw( $2 ) ); }
@@ -2086,5 +2086,5 @@
 aggregate_control:										// CFA
 	GENERATOR
-		{ SemanticError( yylloc, "generator is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; }
+		{ yyy = true; $$ = AggregateDecl::Generator; }
 	| MONITOR GENERATOR
 		{ SemanticError( yylloc, "monitor generator is currently unimplemented." ); $$ = AggregateDecl::NoAggregate; }
