I think an expression like OpenParenToken(source='Q') doesn't make sense -- the type (class) of token suggests it's an opening parenthesis ((), so the only source there can be for such token, that is valid, would be said symbol, nothing else (e.g. not 'Q'); same goes for value attribute (which these tokens do not feature, as it is).