Attributes are used in DotNet to assign meta information to types, members, parameters etc.
attributes : ( attributeBlock )+
attributeBlock : [ attributeTarget? attribute (, attribute)* ]
attributeTarget : identifier :
| keyword :
attribute : name (LPAREN (attributeParam (, attributeParam)* )? RPAREN )?
attributeParam : identifier := expression
| expression
globalAttributes : [ globalAttributeTarget attribute (, attribute)* ] eos
globalAttributeTarget : (ASSEMBLY | MODULE) :