I think there's at least one simple solution
just give it an extra parameter that contains an extra string parameter, to be set to "x" "y" or "z" position("z")
also, I haven't made a plugin yet with c2, but if it has all the options construct classic does you should be able to create undefined expressions that don't require the name be explicitly specified in the code, allowing the ide to accept anything as an expression name. This way positiony or positionz can be handled through there by analyzing the name manually,
in construct classic sdk it'd be something like
long ExtObject::ReturnUndefinedExpression(CString& expName, LPVAL theParams, ExpReturn& ret)
return ret = 0;
but handle positionx the normal way, then name the category something like "MyExpressions - also works with Y and Z".
this way right there in the category they see that there are alternate version of the expressions, but they still have the full list of the x versions, so they know what their choices are
The first way is probably less trouble (with the strings : position("x")) to implement,
and though the second method(undefined expression) is more natural in that you can just type PositionY like a normal expression, it would have the disadvantage that it would allow things like PosixionnY, which could make it difficult for a user to track down if a typo got through.