SyntaxTree aims at being a closer representation of the C++ syntax. As such we are basing its design on the C++ grammar.
The subset of the grammar that we look here is described under [expr.prim.id].
The main questions we ask are:
How to make a clear distinction in the SyntaxTree between optional and required children?
An example of optional children in the context of id-expressions:
qualified-id: nested-name-specifier template_opt unqualified-id
How to encode the OR-relations of the grammar in the SyntaxTree?
In the context of id-expression:
id-expression: unqualified-id qualified-id
Or even
unqualified-id: identifier operator-function-id conversion-function-id literal-operator-id ~ type-name ~ decltype-specifier template-id