Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 119889f9c47003a2856dc01fc1d2a09b8da9b989)
+++ src/Parser/lex.ll	(revision 0eacfd4bdfa495bf0363708f64b2f7ec3f511ca0)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Mon Mar  3 09:21:33 2025
- * Update Count     : 880
+ * Last Modified On : Fri Apr 18 15:23:40 2025
+ * Update Count     : 884
  */
 
@@ -474,9 +474,13 @@
 
 "@="			{ NAMEDOP_RETURN(ATassign); }			// CFA
-"+~"			{ NAMEDOP_RETURN(ErangeUp); }			// CFA
-"~="			{ NAMEDOP_RETURN(ErangeUpEq); }			// CFA
-"+~="			{ NAMEDOP_RETURN(ErangeUpEq); }			// CFA
-"-~"			{ NAMEDOP_RETURN(ErangeDown); }			// CFA
-"-~="			{ NAMEDOP_RETURN(ErangeDownEq); }		// CFA
+"+~"			{ NAMEDOP_RETURN(ErangeUpLt); }			// CFA
+"~="			{ NAMEDOP_RETURN(ErangeUpLe); }			// CFA
+"+~="			{ NAMEDOP_RETURN(ErangeUpLe); }			// CFA
+"-~"			{ NAMEDOP_RETURN(ErangeDownGt); }		// CFA
+"-~="			{ NAMEDOP_RETURN(ErangeDownGe); }		// CFA
+"~=="			{ NAMEDOP_RETURN(ErangeEq); }			// CFA
+"~!="			{ NAMEDOP_RETURN(ErangeNe); }			// CFA
+"-~=="			{ NAMEDOP_RETURN(ErangeDownEq); }		// CFA
+"-~!="			{ NAMEDOP_RETURN(ErangeDownNe); }		// CFA
 
 				/* CFA, operator identifier */
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 119889f9c47003a2856dc01fc1d2a09b8da9b989)
+++ src/Parser/parser.yy	(revision 0eacfd4bdfa495bf0363708f64b2f7ec3f511ca0)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Apr  8 18:36:20 2025
-// Update Count     : 7259
+// Last Modified On : Fri Apr 18 15:23:42 2025
+// Update Count     : 7283
 //
 
@@ -229,5 +229,5 @@
 #define NEW_ZERO new ExpressionNode( build_constantInteger( yylloc, *new string( "0" ) ) )
 #define NEW_ONE  new ExpressionNode( build_constantInteger( yylloc, *new string( "1" ) ) )
-#define UPDOWN( compop, left, right ) (compop == OperKinds::LThan || compop == OperKinds::LEThan ? left : right)
+#define UPDOWN( compop, left, right ) (compop == OperKinds::LThan || compop == OperKinds::LEThan || compop == OperKinds::Neq ? left : right)
 #define MISSING_ANON_FIELD "illegal syntax, missing loop fields with an anonymous loop index is meaningless as loop index is unavailable in loop body."
 #define MISSING_LOW "illegal syntax, missing low value for ascanding range so index is uninitialized."
@@ -242,5 +242,5 @@
 	if ( inc ) inc = new ExpressionNode( build_binary_val( location,
 		// choose += or -= for upto/downto
-		compop == OperKinds::LThan || compop == OperKinds::LEThan ? OperKinds::PlusAssn : OperKinds::MinusAssn,
+		UPDOWN( compop, OperKinds::PlusAssn, OperKinds::MinusAssn ),
 		new ExpressionNode( build_varref( location, new string( *init->name ) ) ),
 		inc ) );
@@ -418,5 +418,6 @@
 %token ANDassign	ERassign	ORassign				// &=	^=	|=
 
-%token ErangeUp		ErangeUpEq	ErangeDown	ErangeDownEq // +~	+~=/~=	-~	-~=
+%token ErangeUpLt	ErangeUpLe	ErangeEq	ErangeNe	// +~ +~=/~= ~== ~!=
+%token ErangeDownGt	ErangeDownGe	ErangeDownEq	ErangeDownNe //	-~ -~= -~== -~!=
 %token ATassign											// @=
 
@@ -442,5 +443,5 @@
 %type<ifctrl> conditional_declaration
 %type<forctrl> for_control_expression	for_control_expression_list
-%type<oper> upupeq updown updowneq downupdowneq
+%type<oper> upupeq	updown	updownS	updownEq
 %type<expr> subrange
 %type<decl> asm_name_opt
@@ -1485,40 +1486,41 @@
 	| comma_expression									// CFA, anonymous loop-index
 		{ $$ = forCtrl( yylloc, $1, new string( DeclarationNode::anonymous.newName() ), NEW_ZERO, OperKinds::LThan, $1->clone(), NEW_ONE ); }
-	| downupdowneq comma_expression						// CFA, anonymous loop-index
+	| updown comma_expression							// CFA, anonymous loop-index
 		{ $$ = forCtrl( yylloc, $2, new string( DeclarationNode::anonymous.newName() ), UPDOWN( $1, NEW_ZERO, $2->clone() ), $1, UPDOWN( $1, $2->clone(), NEW_ZERO ), NEW_ONE ); }
 
-	| comma_expression updowneq comma_expression		// CFA, anonymous loop-index
+	| comma_expression updownS comma_expression			// CFA, anonymous loop-index
 		{ $$ = forCtrl( yylloc, $1, new string( DeclarationNode::anonymous.newName() ), UPDOWN( $2, $1->clone(), $3 ), $2, UPDOWN( $2, $3->clone(), $1->clone() ), NEW_ONE ); }
-	| '@' updowneq comma_expression						// CFA, anonymous loop-index
+	| '@' updownS comma_expression						// CFA, anonymous loop-index
 		{
 			if ( $2 == OperKinds::LThan || $2 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
 			else $$ = forCtrl( yylloc, $3, new string( DeclarationNode::anonymous.newName() ), $3->clone(), $2, nullptr, NEW_ONE );
 		}
-	| comma_expression updowneq '@'						// CFA, anonymous loop-index
+	| comma_expression updownS '@'						// CFA, anonymous loop-index
 		{
 			if ( $2 == OperKinds::LThan || $2 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
 			else { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
 		}
-	| comma_expression updowneq comma_expression '~' comma_expression // CFA, anonymous loop-index
+
+	| comma_expression updownS comma_expression '~' comma_expression // CFA, anonymous loop-index
 		{ $$ = forCtrl( yylloc, $1, new string( DeclarationNode::anonymous.newName() ), UPDOWN( $2, $1->clone(), $3 ), $2, UPDOWN( $2, $3->clone(), $1->clone() ), $5 ); }
-	| '@' updowneq comma_expression '~' comma_expression // CFA, anonymous loop-index
+	| '@' updownS comma_expression '~' comma_expression // CFA, anonymous loop-index
 		{
 			if ( $2 == OperKinds::LThan || $2 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
 			else $$ = forCtrl( yylloc, $3, new string( DeclarationNode::anonymous.newName() ), $3->clone(), $2, nullptr, $5 );
 		}
-	| comma_expression updowneq '@' '~' comma_expression // CFA, anonymous loop-index
+	| comma_expression updownS '@' '~' comma_expression // CFA, anonymous loop-index
 		{
 			if ( $2 == OperKinds::LThan || $2 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
 			else { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
 		}
-	| comma_expression updowneq comma_expression '~' '@' // CFA, invalid syntax rule
+	| comma_expression updownS comma_expression '~' '@' // CFA, invalid syntax rule
 		{ SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
-	| '@' updowneq '@'									// CFA, invalid syntax rule
+	| '@' updownS '@'									// CFA, invalid syntax rule
 		{ SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
-	| '@' updowneq comma_expression '~' '@'				// CFA, invalid syntax rule
+	| '@' updownS comma_expression '~' '@'				// CFA, invalid syntax rule
 		{ SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
-	| comma_expression updowneq '@' '~' '@'				// CFA, invalid syntax rule
+	| comma_expression updownS '@' '~' '@'				// CFA, invalid syntax rule
 		{ SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
-	| '@' updowneq '@' '~' '@'							// CFA, invalid syntax rule
+	| '@' updownS '@' '~' '@'							// CFA, invalid syntax rule
 		{ SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
 
@@ -1527,15 +1529,15 @@
 	| comma_expression ';' comma_expression				// CFA
 		{ $$ = forCtrl( yylloc, $3, $1, NEW_ZERO, OperKinds::LThan, $3->clone(), NEW_ONE ); }
-	| comma_expression ';' downupdowneq comma_expression // CFA
+	| comma_expression ';' updown comma_expression // CFA
 		{ $$ = forCtrl( yylloc, $4, $1, UPDOWN( $3, NEW_ZERO, $4->clone() ), $3, UPDOWN( $3, $4->clone(), NEW_ZERO ), NEW_ONE ); }
 
-	| comma_expression ';' comma_expression updowneq comma_expression // CFA
+	| comma_expression ';' comma_expression updownS comma_expression // CFA
 		{ $$ = forCtrl( yylloc, $3, $1, UPDOWN( $4, $3->clone(), $5 ), $4, UPDOWN( $4, $5->clone(), $3->clone() ), NEW_ONE ); }
-	| comma_expression ';' '@' updowneq comma_expression // CFA
+	| comma_expression ';' '@' updownS comma_expression // CFA
 		{
 			if ( $4 == OperKinds::LThan || $4 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
 			else $$ = forCtrl( yylloc, $5, $1, $5->clone(), $4, nullptr, NEW_ONE );
 		}
-	| comma_expression ';' comma_expression updowneq '@' // CFA
+	| comma_expression ';' comma_expression updownS '@' // CFA
 		{
 			if ( $4 == OperKinds::GThan || $4 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
@@ -1543,15 +1545,18 @@
 			else $$ = forCtrl( yylloc, $3, $1, $3->clone(), $4, nullptr, NEW_ONE );
 		}
-	| comma_expression ';' '@' updowneq '@'				// CFA, invalid syntax rule
+	| comma_expression ';' '@' updownS '@'				// CFA, invalid syntax rule
 		{ SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; }
 
-	| comma_expression ';' comma_expression updowneq comma_expression '~' comma_expression // CFA
+	| comma_expression ';' comma_expression updownEq comma_expression // CFA
+		{ $$ = forCtrl( yylloc, $3, $1, UPDOWN( $4, $3->clone(), $5 ), $4, UPDOWN( $4, $5->clone(), $3->clone() ), NEW_ONE ); }
+
+	| comma_expression ';' comma_expression updownS comma_expression '~' comma_expression // CFA
 		{ $$ = forCtrl( yylloc, $3, $1, UPDOWN( $4, $3->clone(), $5 ), $4, UPDOWN( $4, $5->clone(), $3->clone() ), $7 ); }
-	| comma_expression ';' '@' updowneq comma_expression '~' comma_expression // CFA, invalid syntax rule
+	| comma_expression ';' '@' updownS comma_expression '~' comma_expression // CFA, invalid syntax rule
 		{
 			if ( $4 == OperKinds::LThan || $4 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
 			else $$ = forCtrl( yylloc, $5, $1, $5->clone(), $4, nullptr, $7 );
 		}
-	| comma_expression ';' comma_expression updowneq '@' '~' comma_expression // CFA
+	| comma_expression ';' comma_expression updownS '@' '~' comma_expression // CFA
 		{
 			if ( $4 == OperKinds::GThan || $4 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
@@ -1559,12 +1564,12 @@
 			else $$ = forCtrl( yylloc, $3, $1, $3->clone(), $4, nullptr, $7 );
 		}
-	| comma_expression ';' comma_expression updowneq comma_expression '~' '@' // CFA
+	| comma_expression ';' comma_expression updownS comma_expression '~' '@' // CFA
 		{ $$ = forCtrl( yylloc, $3, $1, UPDOWN( $4, $3->clone(), $5 ), $4, UPDOWN( $4, $5->clone(), $3->clone() ), nullptr ); }
-	| comma_expression ';' '@' updowneq comma_expression '~' '@' // CFA, invalid syntax rule
+	| comma_expression ';' '@' updownS comma_expression '~' '@' // CFA, invalid syntax rule
 		{
 			if ( $4 == OperKinds::LThan || $4 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
 			else $$ = forCtrl( yylloc, $5, $1, $5->clone(), $4, nullptr, nullptr );
 		}
-	| comma_expression ';' comma_expression updowneq '@' '~' '@' // CFA
+	| comma_expression ';' comma_expression updownS '@' '~' '@' // CFA
 		{
 			if ( $4 == OperKinds::GThan || $4 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
@@ -1572,21 +1577,20 @@
 			else $$ = forCtrl( yylloc, $3, $1, $3->clone(), $4, nullptr, nullptr );
 		}
-	| comma_expression ';' '@' updowneq '@' '~' '@' // CFA
+	| comma_expression ';' '@' updownS '@' '~' '@'		// CFA
 		{ SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; }
 
-//	| '@' identifier ';' comma_expression			// CFA
 	| declaration comma_expression						// CFA
 		{ $$ = forCtrl( yylloc, $1, NEW_ZERO, OperKinds::LThan, $2, NEW_ONE ); }
-	| declaration downupdowneq comma_expression			// CFA
+	| declaration updown comma_expression				// CFA
 		{ $$ = forCtrl( yylloc, $1, UPDOWN( $2, NEW_ZERO, $3 ), $2, UPDOWN( $2, $3->clone(), NEW_ZERO ), NEW_ONE ); }
 
-	| declaration comma_expression updowneq comma_expression // CFA
+	| declaration comma_expression updownS comma_expression // CFA
 		{ $$ = forCtrl( yylloc, $1, UPDOWN( $3, $2->clone(), $4 ), $3, UPDOWN( $3, $4->clone(), $2->clone() ), NEW_ONE ); }
-	| declaration '@' updowneq comma_expression			// CFA
+	| declaration '@' updownS comma_expression			// CFA
 		{
 			if ( $3 == OperKinds::LThan || $3 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
 			else $$ = forCtrl( yylloc, $1, $4, $3, nullptr, NEW_ONE );
 		}
-	| declaration comma_expression updowneq '@'			// CFA
+	| declaration comma_expression updownS '@'			// CFA
 		{
 			if ( $3 == OperKinds::GThan || $3 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
@@ -1595,12 +1599,15 @@
 		}
 
-	| declaration comma_expression updowneq comma_expression '~' comma_expression // CFA
+	| declaration comma_expression updownEq comma_expression // CFA
+		{ $$ = forCtrl( yylloc, $1, UPDOWN( $3, $2->clone(), $4 ), $3, UPDOWN( $3, $4->clone(), $2->clone() ), NEW_ONE ); }
+
+	| declaration comma_expression updownS comma_expression '~' comma_expression // CFA
 		{ $$ = forCtrl( yylloc, $1, UPDOWN( $3, $2, $4 ), $3, UPDOWN( $3, $4->clone(), $2->clone() ), $6 ); }
-	| declaration '@' updowneq comma_expression '~' comma_expression // CFA
+	| declaration '@' updownS comma_expression '~' comma_expression // CFA
 		{
 			if ( $3 == OperKinds::LThan || $3 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
 			else $$ = forCtrl( yylloc, $1, $4, $3, nullptr, $6 );
 		}
-	| declaration comma_expression updowneq '@' '~' comma_expression // CFA
+	| declaration comma_expression updownS '@' '~' comma_expression // CFA
 		{
 			if ( $3 == OperKinds::GThan || $3 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
@@ -1608,12 +1615,12 @@
 			else $$ = forCtrl( yylloc, $1, $2, $3, nullptr, $6 );
 		}
-	| declaration comma_expression updowneq comma_expression '~' '@' // CFA
+	| declaration comma_expression updownS comma_expression '~' '@' // CFA
 		{ $$ = forCtrl( yylloc, $1, UPDOWN( $3, $2, $4 ), $3, UPDOWN( $3, $4->clone(), $2->clone() ), nullptr ); }
-	| declaration '@' updowneq comma_expression '~' '@' // CFA
+	| declaration '@' updownS comma_expression '~' '@'	// CFA
 		{
 			if ( $3 == OperKinds::LThan || $3 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_LOW ); $$ = nullptr; }
 			else $$ = forCtrl( yylloc, $1, $4, $3, nullptr, nullptr );
 		}
-	| declaration comma_expression updowneq '@' '~' '@'	// CFA
+	| declaration comma_expression updownS '@' '~' '@'	// CFA
 		{
 			if ( $3 == OperKinds::GThan || $3 == OperKinds::GEThan ) { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
@@ -1621,5 +1628,5 @@
 			else $$ = forCtrl( yylloc, $1, $2, $3, nullptr, nullptr );
 		}
-	| declaration '@' updowneq '@' '~' '@'				// CFA, invalid syntax rule
+	| declaration '@' updownS '@' '~' '@'				// CFA, invalid syntax rule
 		{ SemanticError( yylloc, "illegal syntax, missing low/high value for ascending/descending range so index is uninitialized." ); $$ = nullptr; }
 
@@ -1628,5 +1635,5 @@
 			$$ = enumRangeCtrl( $1, OperKinds::LEThan, new ExpressionNode( new ast::TypeExpr( yylloc, $3->clone()->buildType() ) ), $3 );
 		}
-	| comma_expression ';' downupdowneq enum_key		// CFA, enum type, reverse direction
+	| comma_expression ';' updown enum_key				// CFA, enum type, reverse direction
 		{
 			if ( $3 == OperKinds::GThan ) {
@@ -1656,33 +1663,33 @@
 	;
 
-// This rule exists to handle the ambiguity with unary operator '~'. The rule is the same as updowneq minus the '~'.
+// This rule exists to handle the ambiguity with unary operator '~'. The rule is the same as updownS minus the '~'.
 // Specifically, "for ( ~5 )" means the complement of 5, not loop 0..4. Hence, in this case "for ( ~= 5 )", i.e., 0..5,
 // it is not possible to just remove the '='. The entire '~=' must be removed.
-downupdowneq:
-	ErangeUp
+updown:
+	ErangeUpLt
 		{ $$ = OperKinds::LThan; }
-	| ErangeDown
+	| ErangeDownGt
 		{ $$ = OperKinds::GThan; }
-	| ErangeUpEq
+	| ErangeUpLe
 		{ $$ = OperKinds::LEThan; }
-	| ErangeDownEq
+	| ErangeDownGe
 		{ $$ = OperKinds::GEThan; }
 	;
 
-updown:
+updownS:
 	'~'													// shorthand 0 ~ 10 => 0 +~ 10
 		{ $$ = OperKinds::LThan; }
-	| ErangeUp
-		{ $$ = OperKinds::LThan; }
-	| ErangeDown
-		{ $$ = OperKinds::GThan; }
-	;
-
-updowneq:
-	updown
-	| ErangeUpEq
-		{ $$ = OperKinds::LEThan; }
+	| updown
+	;
+
+updownEq:
+	ErangeEq
+		{ $$ = OperKinds::Eq; }
+	| ErangeNe
+		{ $$ = OperKinds::Neq; }
 	| ErangeDownEq
-		{ $$ = OperKinds::GEThan; }
+		{ $$ = OperKinds::Eq; }
+	| ErangeDownNe
+		{ $$ = OperKinds::Neq; }
 	;
 
@@ -4061,5 +4068,5 @@
 	'~'
 		{ $$ = OperKinds::LThan; }
-	| ErangeUpEq
+	| ErangeUpLe
 		{ $$ = OperKinds::LEThan; }
 	;
