10.2.5 Brace List Symbols

There are a set of syntactic symbols that are used to recognize constructs inside of brace lists. A brace list is defined as an enum or aggregate initializer list, such as might statically initialize an array of structs. The three special aggregate constructs in Pike, ({ }), ([ ]) and (< >), are treated as brace lists too. An example:

 1: static char* ingredients[] =
 2: {
 3:     "Ham",
 4:     "Salt",
 5:     NULL
 6: };

Following convention, line 2 in this example is assigned brace-list-open syntax, and line 3 is assigned brace-list-intro syntax. Likewise, line 6 is assigned brace-list-close syntax. Lines 4 and 5 however, are assigned brace-list-entry syntax, as would all subsequent lines in this initializer list.

Your static initializer might be initializing nested structures, for example:

 1: struct intpairs[] =
 2: {
 3:     { 1, 2 },
 4:     {
 5:         3,
 6:         4
 7:     }
 8:     { 1,
 9:       2 },
10:     { 3, 4 }
11: };

Here, you’ve already seen the analysis of lines 1, 2, 3, and 11. On line 4, things get interesting; this line is assigned brace-entry-open syntactic symbol because it’s a bracelist entry line that starts with an open brace. Lines 5 and 6 are pretty standard, and line 7 is a brace-list-close as you’d expect. Once again, line 8 is assigned as brace-entry-open as is line 10. Line 9 is assigned two syntactic elements, brace-list-intro with anchor point at the ‘{’ of line 839, and brace-list-entry anchored on the ‘1’ of line 8.


Footnotes

(39)

This extra syntactic element was introduced in CC Mode 5.33.1 to allow extra flexibility in indenting the second line of such a construct. You can preserve the behaviour resulting from the former syntactic analysis by giving brace-list-entry an offset of c-lineup-under-anchor (see Miscellaneous Line-Up Functions).