Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 16ba4897edb8e47f2990f485549b0053dee60bae)
+++ src/Parser/lex.ll	(revision c565d68d15124106fe65d3aa6a3624724d52a7a3)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Mon Sep 23 22:45:33 2024
- * Update Count     : 792
+ * Last Modified On : Sun Oct 13 10:03:28 2024
+ * Update Count     : 869
  */
 
@@ -147,5 +147,5 @@
 				// character escape sequence, GCC: \e => esc character
 simple_escape "\\"[abefnrtv'"?\\]
-				// ' stop editor highlighting
+				// " stop editor highlighting
 octal_escape "\\"{octal}("_"?{octal}){0,2}
 hex_escape "\\""x""_"?{hex_digits}
@@ -155,9 +155,12 @@
 
 				// display/white-space characters
-h_tab [\011]
-form_feed [\014]
-v_tab [\013]
-c_return [\015]
-h_white [ ]|{h_tab}
+h_tab "\t"
+form_feed "\f"
+v_tab "\v"
+new_line "\n"
+c_return "\r"
+h_white " "|{h_tab}
+v_white {v_tab}|{c_return}|{form_feed}
+hv_white {h_white}|{v_tab}|{new_line}|{c_return}|{form_feed}
 
 				// overloadable operators
@@ -171,4 +174,9 @@
 				// op_binary_not_over "?"|"->"|"."|"&&"|"||"|"@="
 				// operator {op_unary_pre_post}|{op_binary_over}|{op_binary_not_over}
+
+				// C23 attributes
+attr_string "\""[^\"]*"\""
+attr_arg_opt ({hv_white}*"("{hv_white}*{attr_string}{hv_white}*")")?
+attributes "deprecated"{attr_arg_opt}|"fallthrough"|"nodiscard"{attr_arg_opt}|"maybe_unused"|"noreturn"|"_Noreturn"|"unsequenced"|"unused"|"reproducible"|{identifier}{hv_white}*"::"{hv_white}*{identifier}
 
 %x COMMENT
@@ -212,7 +220,6 @@
 
 				/* ignore whitespace */
-{h_white}+		{ WHITE_RETURN(' '); }
-({v_tab}|{c_return}|{form_feed})+ { WHITE_RETURN(' '); }
-({h_white}|{v_tab}|{c_return}|{form_feed})*"\n" { NEWLINE_RETURN(); }
+({h_white}|{v_white})+ { WHITE_RETURN(' '); }			// do nothing
+"\n"			{ NEWLINE_RETURN(); }					// reset column counter
 
 				/* keywords */
@@ -373,10 +380,16 @@
 }
 
+				/* C23 attributes */
+"[["{hv_white}*{attributes}({hv_white}*","{hv_white}*{attributes})*{hv_white}*"]]" {
+	strtext = new string( &yytext[2], yyleng - 4 );		// remove [[]]
+	RETURN_STR(C23_ATTRIBUTE);
+}
+
 				/* numeric constants */
 {binary_constant} { NUMERIC_RETURN(INTEGERconstant); }
 {octal_constant} { NUMERIC_RETURN(INTEGERconstant); }
 {decimal_constant} { NUMERIC_RETURN(INTEGERconstant); }
-{hex_constant}	{ NUMERIC_RETURN(INTEGERconstant); }
-{floating_decimal}	{ NUMERIC_RETURN(FLOATING_DECIMALconstant); } // must appear before floating_constant
+{hex_constant} { NUMERIC_RETURN(INTEGERconstant); }
+{floating_decimal} { NUMERIC_RETURN(FLOATING_DECIMALconstant); } // must appear before floating_constant
 {floating_fraction}	{ NUMERIC_RETURN(FLOATING_FRACTIONconstant); } // must appear before floating_constant
 {floating_constant}	{ NUMERIC_RETURN(FLOATINGconstant); }
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 16ba4897edb8e47f2990f485549b0053dee60bae)
+++ src/Parser/parser.yy	(revision c565d68d15124106fe65d3aa6a3624724d52a7a3)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Sep 30 09:40:28 2024
-// Update Count     : 6776
+// Last Modified On : Sun Oct 13 12:18:15 2024
+// Update Count     : 6845
 //
 
@@ -392,5 +392,5 @@
 %token<tok> TIMEOUT			WAND	WOR		CATCH			RECOVER			CATCHRESUME		FIXUP		FINALLY		// CFA
 %token<tok> INTEGERconstant	CHARACTERconstant	STRINGliteral
-%token<tok> DIRECTIVE
+%token<tok> DIRECTIVE		C23_ATTRIBUTE
 // Floating point constant is broken into three kinds of tokens because of the ambiguity with tuple indexing and
 // overloading constants 0/1, e.g., x.1 is lexed as (x)(.1), where (.1) is a factional constant, but is semantically
@@ -1169,12 +1169,14 @@
 		// CFA, one assignment_expression is factored out of comma_expression to eliminate a shift/reduce conflict with
 		// comma_expression in cfa_identifier_parameter_array and cfa_abstract_array
-//	'[' ']'
-//		{ $$ = new ExpressionNode( build_tuple() ); }
-//	'[' assignment_expression ']'
-//		{ $$ = new ExpressionNode( build_tuple( $2 ) ); }
-	'[' ',' tuple_expression_list ']'
-		{ $$ = new ExpressionNode( build_tuple( yylloc, (new ExpressionNode( nullptr ))->set_last( $3 ) ) ); }
-	| '[' assignment_expression ',' tuple_expression_list ']'
+	'[' ',' ']'
+		{ $$ = new ExpressionNode( build_tuple( yylloc, nullptr ) ); }
+	| '[' assignment_expression ',' ']'
+		{ $$ = new ExpressionNode( build_tuple( yylloc, $2 ) ); }
+	| '[' '@' comma_opt ']'
+		{ SemanticError( yylloc, "Eliding tuple element with '@' is currently unimplemented." ); $$ = nullptr; }
+	| '[' assignment_expression ',' tuple_expression_list comma_opt ']'
 	 	{ $$ = new ExpressionNode( build_tuple( yylloc, $2->set_last( $4 ) ) ); }
+	| '[' '@' ',' tuple_expression_list comma_opt ']'
+		{ SemanticError( yylloc, "Eliding tuple element with '@' is currently unimplemented." ); $$ = nullptr; }
 	;
 
@@ -3050,6 +3052,6 @@
 
 designation:
-	designator_list ':'									// C99, CFA uses ":" instead of "="
-	| identifier_at ':'									// GCC, field name
+	designator_list '='									// C99, CFA uses ":" instead of "="
+	| identifier_at ':'									// GCC, field name, obsolete since GCC 2.5
 		{ $$ = new ExpressionNode( build_varref( yylloc, $1 ) ); }
 	;
@@ -3059,5 +3061,4 @@
 	| designator_list designator
 		{ $$ = $1->set_last( $2 ); }
-	//| designator_list designator						{ $$ = new ExpressionNode( $1, $2 ); }
 	;
 
@@ -3065,6 +3066,5 @@
 	'.' identifier_at									// C99, field name
 		{ $$ = new ExpressionNode( build_varref( yylloc, $2 ) ); }
-	| '[' assignment_expression ']'						// C99, single array element
-		// assignment_expression used instead of constant_expression because of shift/reduce conflicts with tuple.
+	| '[' constant_expression ']'						// C99, single array element
 		{ $$ = $2; }
 	| '[' subrange ']'									// CFA, multiple array elements
@@ -3513,4 +3513,6 @@
 	| ATTR '(' attribute_name_list ')'					// CFA
 		{ $$ = $3; }
+	| C23_ATTRIBUTE
+		{ $$ = DeclarationNode::newAttribute( $1 ); }
 	;
 
