Composite ::= Schedule ('also' Schedule)* (('except' Schedule) ('also' Schedule)*)? Schedule ::= ( ('on the' ('first' | 'last' | Number_Range) Period) | ('every' ('weekend' | 'weekday' | ((Number Period)) (('starting on the' Number Period) | ('between the' Number 'and' Number))?)) | ('after' ((Number Period) | Time)) | ('before' ((Number Period) | Time)) | ('at' Time ('and' Time)*) | ('on' Day (Day_Range)?) | ('of' Month (Month_Range)?) | ('in' Year (Year_Range)?) )+ Range ::= (('-' | 'through') Value) | ((',' | 'and') Value)+