diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp
index 203f70d8202e7861b9149b33c20415ddc4c940f4..37eeb15477597669ef70570db6138162ba2372dc 100644
--- a/alib2cli/src/parser/Parser.cpp
+++ b/alib2cli/src/parser/Parser.cpp
@@ -435,9 +435,14 @@ std::unique_ptr < Command > Parser::command ( ) {
 std::unique_ptr < Expression > Parser::assign_expression ( ) {
 	std::unique_ptr < Expression > res = or_expression ( );
 	if ( check ( cli::Lexer::TokenType::ASSIGN_OPERATOR ) ) {
+		auto checkOptions = getCheckOptions ( );
+		clearCheckOptions ( );
+
 		match ( cli::Lexer::TokenType::ASSIGN_OPERATOR );
 
 		res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::ASSIGN, std::move ( res ), assign_expression ( ) );
+
+		restoreCheckOptions ( checkOptions );
 	}
 	return res;
 }
@@ -445,9 +450,14 @@ std::unique_ptr < Expression > Parser::assign_expression ( ) {
 std::unique_ptr < Expression > Parser::or_expression ( ) {
 	std::unique_ptr < Expression > res = and_expression ( );
 	while ( check ( cli::Lexer::TokenType::OR_OPERATOR ) ) {
+		auto checkOptions = getCheckOptions ( );
+		clearCheckOptions ( );
+
 		match ( cli::Lexer::TokenType::OR_OPERATOR );
 
 		res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::LOGICAL_OR, std::move ( res ), and_expression ( ) );
+
+		restoreCheckOptions ( checkOptions );
 	}
 	return res;
 }
@@ -455,9 +465,14 @@ std::unique_ptr < Expression > Parser::or_expression ( ) {
 std::unique_ptr < Expression > Parser::and_expression ( ) {
 	std::unique_ptr < Expression > res = bitwise_or_expression ( );
 	while ( check ( cli::Lexer::TokenType::AND_OPERATOR ) ) {
+		auto checkOptions = getCheckOptions ( );
+		clearCheckOptions ( );
+
 		match ( cli::Lexer::TokenType::AND_OPERATOR );
 
 		res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::LOGICAL_AND, std::move ( res ), bitwise_or_expression ( ) );
+
+		restoreCheckOptions ( checkOptions );
 	}
 	return res;
 }
@@ -465,9 +480,14 @@ std::unique_ptr < Expression > Parser::and_expression ( ) {
 std::unique_ptr < Expression > Parser::bitwise_or_expression ( ) {
 	std::unique_ptr < Expression > res = bitwise_and_expression ( );
 	while ( check ( cli::Lexer::TokenType::PIPE_SIGN ) ) {
+		auto checkOptions = getCheckOptions ( );
+		clearCheckOptions ( );
+
 		match ( cli::Lexer::TokenType::PIPE_SIGN );
 
 		res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::BINARY_OR, std::move ( res ), bitwise_and_expression ( ) );
+
+		restoreCheckOptions ( checkOptions );
 	}
 	return res;
 }
@@ -475,9 +495,14 @@ std::unique_ptr < Expression > Parser::bitwise_or_expression ( ) {
 std::unique_ptr < Expression > Parser::bitwise_and_expression ( ) {
 	std::unique_ptr < Expression > res = bitwise_xor_expression ( );
 	while ( check ( cli::Lexer::TokenType::AMPERSAND_SIGN ) ) {
+		auto checkOptions = getCheckOptions ( );
+		clearCheckOptions ( );
+
 		match ( cli::Lexer::TokenType::AMPERSAND_SIGN );
 
 		res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::BINARY_AND, std::move ( res ), bitwise_xor_expression ( ) );
+
+		restoreCheckOptions ( checkOptions );
 	}
 	return res;
 }
@@ -485,15 +510,22 @@ std::unique_ptr < Expression > Parser::bitwise_and_expression ( ) {
 std::unique_ptr < Expression > Parser::bitwise_xor_expression ( ) {
 	std::unique_ptr < Expression > res = equality_expression ( );
 	while ( check ( cli::Lexer::TokenType::CARET_SIGN ) ) {
+		auto checkOptions = getCheckOptions ( );
+		clearCheckOptions ( );
+
 		match ( cli::Lexer::TokenType::CARET_SIGN );
 
 		res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::BINARY_XOR, std::move ( res ), equality_expression ( ) );
+
+		restoreCheckOptions ( checkOptions );
 	}
 	return res;
 }
 
 std::unique_ptr < Expression > Parser::equality_expression ( ) {
 	std::unique_ptr < Expression > res = relational_expression ( );
+	auto checkOptions = getCheckOptions ( );
+	clearCheckOptions ( );
 	if ( check ( cli::Lexer::TokenType::EQUAL_OPERATOR ) ) {
 		match ( cli::Lexer::TokenType::EQUAL_OPERATOR );
 		res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::EQUALS, std::move ( res ), relational_expression ( ) );
@@ -501,11 +533,14 @@ std::unique_ptr < Expression > Parser::equality_expression ( ) {
 		match ( cli::Lexer::TokenType::NOT_EQUAL_OPERATOR );
 		res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::NOT_EQUALS, std::move ( res ), relational_expression ( ) );
 	}
+	restoreCheckOptions ( checkOptions );
 	return res;
 }
 
 std::unique_ptr < Expression > Parser::relational_expression ( ) {
 	std::unique_ptr < Expression > res = add_expression ( );
+	auto checkOptions = getCheckOptions ( );
+	clearCheckOptions ( );
 	if ( check ( cli::Lexer::TokenType::LESS_SIGN ) ) {
 		match ( cli::Lexer::TokenType::LESS_SIGN );
 		res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::LESS, std::move ( res ), add_expression ( ) );
@@ -519,12 +554,15 @@ std::unique_ptr < Expression > Parser::relational_expression ( ) {
 		match ( cli::Lexer::TokenType::MORE_OR_EQUAL_OPERATOR );
 		res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::MORE_OR_EQUAL, std::move ( res ), add_expression ( ) );
 	}
+	restoreCheckOptions ( checkOptions );
 	return res;
 }
 
 std::unique_ptr < Expression > Parser::add_expression ( ) {
 	std::unique_ptr < Expression > res = mul_expression ( );
 	while ( check ( cli::Lexer::TokenType::PLUS_SIGN, cli::Lexer::TokenType::MINUS_SIGN ) ) {
+		auto checkOptions = getCheckOptions ( );
+		clearCheckOptions ( );
 		if ( check ( cli::Lexer::TokenType::PLUS_SIGN ) ) {
 			match ( cli::Lexer::TokenType::PLUS_SIGN );
 			res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::ADD, std::move ( res ), mul_expression ( ) );
@@ -532,6 +570,7 @@ std::unique_ptr < Expression > Parser::add_expression ( ) {
 			match ( cli::Lexer::TokenType::MINUS_SIGN );
 			res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::SUB, std::move ( res ), mul_expression ( ) );
 		}
+		restoreCheckOptions ( checkOptions );
 	}
 	return res;
 }
@@ -539,6 +578,8 @@ std::unique_ptr < Expression > Parser::add_expression ( ) {
 std::unique_ptr < Expression > Parser::mul_expression ( ) {
 	std::unique_ptr < Expression > res = prefix_expression ( );
 	while ( check ( cli::Lexer::TokenType::STAR_SIGN, cli::Lexer::TokenType::PERCENTAGE_SIGN, cli::Lexer::TokenType::SLASH_SIGN ) ) {
+		auto checkOptions = getCheckOptions ( );
+		clearCheckOptions ( );
 		if ( check ( cli::Lexer::TokenType::STAR_SIGN ) ) {
 			match ( cli::Lexer::TokenType::STAR_SIGN );
 			res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::MUL, std::move ( res ), prefix_expression ( ) );
@@ -549,11 +590,13 @@ std::unique_ptr < Expression > Parser::mul_expression ( ) {
 			match ( cli::Lexer::TokenType::SLASH_SIGN );
 			res = std::make_unique < BinaryExpression > ( abstraction::Operators::BinaryOperators::DIV, std::move ( res ), prefix_expression ( ) );
 		}
+		restoreCheckOptions ( checkOptions );
 	}
 	return res;
 }
 
 std::unique_ptr < Expression > Parser::prefix_expression ( ) {
+	clearCheckOptions ( );
 	if ( check_nonreserved_kw ( "cast"  ) ) {
 		match_nonreserved_kw ( "cast" );
 		match ( cli::Lexer::TokenType::LEFT_PAREN );
@@ -592,7 +635,10 @@ std::unique_ptr < Expression > Parser::prefix_expression ( ) {
 
 std::unique_ptr < Expression > Parser::suffix_expression ( ) {
 	std::unique_ptr < Expression > res = atom ( );
+	clearCheckOptions ( );
 	while ( check ( cli::Lexer::TokenType::DOT, cli::Lexer::TokenType::INC_OPERATOR, cli::Lexer::TokenType::DEC_OPERATOR ) ) {
+		auto checkOptions = getCheckOptions ( );
+		clearCheckOptions ( );
 		if ( check ( cli::Lexer::TokenType::DOT ) ) {
 			match ( cli::Lexer::TokenType::DOT );
 			std::string memberName = getTokenValue ( );
@@ -606,8 +652,9 @@ std::unique_ptr < Expression > Parser::suffix_expression ( ) {
 			match ( cli::Lexer::TokenType::DEC_OPERATOR );
 			res = std::make_unique < PostfixExpression > ( abstraction::Operators::PostfixOperators::DECREMENT, std::move ( res ) );
 		} else {
-			throw exception::CommonException ( "Mismatched set while expanding suffix expression rule. Token is " + Lexer::tokenTypeToString ( m_current.m_type ) + "." );
+			throw exception::CommonException ( "Mismatched set " + ext::to_string ( getCheckOptions ( ) ) + " while expanding suffix_expression rule. Token is " + ( ( std::string ) m_current ) + "." );
 		}
+		restoreCheckOptions ( checkOptions );
 	}
 	return res;
 }
@@ -634,7 +681,7 @@ std::unique_ptr < Expression > Parser::atom ( ) {
 		int value = matchInteger ( );
 		return std::make_unique < ImmediateExpression < int > > ( value );
 	} else {
-		throw exception::CommonException ( "Mismatched set while expanding parse rule. Token is " + ( ( std::string ) m_current ) + "." );
+		throw exception::CommonException ( "Mismatched set " + ext::to_string ( getCheckOptions ( ) ) + " while expanding prefix_expression and atom rules. Token is " + ( ( std::string ) m_current ) + "." );
 	}
 }