Fixtype of GCC attributes.
This is a tagged union type, introduced by fty::deftagsum.
This is part of the GCC extension for attributes. For now we only model the older
The documentation lists three kinds of attributes: empty, names, and names with parameters. For now we only model the latter two kinds. The documentation lists three kinds of parameters (which presumably refer to the whole collection of parameters of a single attribute with parameters, not to a single parameter, because otherwise it would be unclear what it means, for a single parameter, to be a comma-separated list of things, given that parameters are themselves comma-separated. However, the three kinds of (lists of) parameters overlap syntactically: an instance of the first kind, i.e. an identifier, could be also an expression, and thus could be also an instance of the third kind; an instance of the second kind, i.e. an identifier followed by one or more expressions, could be also just a list of two or more expressions, and thus an instance of the third kind. Thus, we simply define an attribute with parameter as containing a list of zero or more expressions, which covers all three kinds of parameters.
Although an attribute name could be an identifier or a keyword, since grammatically keywords are also identifiers, we just use identifiers in this definition of attributes. We can always identify which identifiers are in fact keywords.
Note the distinction between an attribute that is just a name, and an attributed that consists of a name and zero parameters: in concrete syntax, the latter would include open and closed parentheses, without anything in between (except white space or comments).