The first problem is that your last rule for creating the complex annotation missed the slashes (SPECIAL). The slashes are not part of the other annotations thus the last rule is not able to match on a follow-of CommenceDate since there is none yet, but a slash. The rule would work if either the slashes are included in the annotations CommenceDate and CommenceYear, or if the last rule includes the slashes in ther sequential pattern: CommenceMonth SPECIAL CommenceDate SPECIAL CommenceYear...
.
The second problem is the wrong usage of the CREATE action. The annotation values of features are assigned in the CREATE action using the type since this action tries to find the annoations within the matched context. The index of the rule elements is used in the GATHER action for assigning annoations outside of the matched context of the rule elements.
You could rewrite your last rule, for example, in these ways for solving your problem:
Using the action GATHER:
CommenceMonth SPECIAL CommenceDate SPECIAL CommenceYear
{-> GATHER(CommDate, 1, 5, "CMonth" = 1, "CDate" = 3, "CYear" = 5) };
Using the action CREATE:
CommenceMonth SPECIAL CommenceDate SPECIAL CommenceYear
{-> CREATE(CommDate, 1, 5, "CMonth" = CommenceMonth, "CDate" = CommenceDate, "CYear" = CommenceYear) };
A more compact representation of the example could be (using a bit different code style, but the same pattern):
DECLARE Month, Day, Year;
DECLARE Annotation Date (Month month, Day day, Year year);
(NUM{REGEXP("[0-3]?[0-9]?") -> Month} SPECIAL NUM{REGEXP("[0-3]?[0-9]?")-> Day}
SPECIAL NUM{REGEXP("19..|20..") -> Year}){-> CREATE(Date, "month" = Month, "day" = Day, "year" = Year)};