Minimal reproducible case: { if::while }; this should error out since neither are valid identifier names, as they're keyword names. The most unobtrusive solution is to validate on concrete Identifier construction in the parser, but it's probably best not to tokenize qualified identifiers at once and just produce a path :: token, which then the parser handles correctly during lowering (taking the next identifier and enforcing juxtaposition).
Minimal reproducible case:
{ if::while }; this should error out since neither are valid identifier names, as they're keyword names. The most unobtrusive solution is to validate on concreteIdentifierconstruction in the parser, but it's probably best not to tokenize qualified identifiers at once and just produce a path::token, which then the parser handles correctly during lowering (taking the next identifier and enforcing juxtaposition).