diff --git a/corpus/expressions.txt b/corpus/expressions.txt index 3461672..a2c931b 100644 --- a/corpus/expressions.txt +++ b/corpus/expressions.txt @@ -332,8 +332,14 @@ Compound literals ============================================ int main() { - x = (SomeType) { .f1 = 5, .f2 = 6, .f3 = {} }; - y = (struct SomeStruct) { 7, 8 }; + x = (SomeType) { + .f1.f2[f3] = 5, + .f4 = {} + }; + y = (struct SomeStruct) { + 7, + 8 + }; } --- @@ -348,9 +354,14 @@ int main() { (compound_literal_expression (type_descriptor (type_identifier)) (initializer_list - (designator (field_identifier)) (number_literal) - (designator (field_identifier)) (number_literal) - (designator (field_identifier)) (initializer_list))))) + (initializer_pair + (field_designator (field_identifier)) + (field_designator (field_identifier)) + (subscript_designator (identifier)) + (number_literal)) + (initializer_pair + (field_designator (field_identifier)) + (initializer_list)))))) (expression_statement (assignment_expression (identifier) (compound_literal_expression @@ -364,7 +375,6 @@ Compound literals with trailing commas ============================================ int main() { - x = (SomeType) { .f1 = 5, .f2 = 6, }; y = (struct SomeStruct) { 7, 8, }; } @@ -375,17 +385,10 @@ int main() { (primitive_type) (function_declarator (identifier) (parameter_list)) (compound_statement - (expression_statement (assignment_expression - (identifier) - (compound_literal_expression - (type_descriptor (type_identifier)) - (initializer_list - (designator (field_identifier)) (number_literal) - (designator (field_identifier)) (number_literal))))) - (expression_statement (assignment_expression - (identifier) - (compound_literal_expression - (type_descriptor (struct_specifier (type_identifier))) - (initializer_list - (number_literal) - (number_literal)))))))) + (expression_statement (assignment_expression + (identifier) + (compound_literal_expression + (type_descriptor (struct_specifier (type_identifier))) + (initializer_list + (number_literal) + (number_literal)))))))) diff --git a/grammar.js b/grammar.js index fdd0fe9..2dc0800 100644 --- a/grammar.js +++ b/grammar.js @@ -695,30 +695,24 @@ module.exports = grammar({ initializer_list: $ => seq( '{', - optional(seq( - $._initializer_list_contents, - optional(',') + commaSep(choice( + $.initializer_pair, + $._expression, + $.initializer_list )), + optional(','), '}' ), - _initializer_list_contents: $ => commaSepTrailing( - $._initializer_list_contents, - seq( - optional(seq(repeat1($.designator), '=')), - choice($._expression, $.initializer_list) - ) + initializer_pair: $ => seq( + repeat1(choice($.subscript_designator, $.field_designator)), + '=', + choice($._expression, $.initializer_list) ), - designator: $ => choice( - seq('[', $._expression, ']'), - seq('.', $._field_identifier) - ), + subscript_designator: $ => seq('[', $._expression, ']'), - initializer: $ => choice( - $._expression, - $.initializer_list - ), + field_designator: $ => seq('.', $._field_identifier), number_literal: $ => token(seq( choice(