The goal was to avoid impacting performance of non-dynamic attribute sets as much as possible. There's no ambiguity: an attrpath can't have an attr_dynamic, and an attrpath_dynamic must have at least one. Handling attr_dynamic in attrpath would mean changing attrpath from `vector<Symbol>` to `vector<Expr *>` (or `vector<TaggedUnionOfSymbolAndExprConcatStrings*>`) and adding a later check to see if it was a dynamic or static attr. I don't really know the performance implications of the extra productions though, so perhaps that would be better?