in app/scripts/modules/core/utils/later/later.js [1407:1482]
function parseScheduleExpr(str) {
pos = 0;
input = str;
error = -1;
let r = recur();
while (pos < input.length && error < 0) {
let token = parseToken([ TOKENTYPES.every, TOKENTYPES.after, TOKENTYPES.before, TOKENTYPES.onthe, TOKENTYPES.on, TOKENTYPES.of, TOKENTYPES["in"], TOKENTYPES.at, TOKENTYPES.and, TOKENTYPES.except, TOKENTYPES.also ]);
switch (token.type) {
case TOKENTYPES.every:
parseEvery(r);
break;
case TOKENTYPES.after:
if (peek(TOKENTYPES.time).type !== undefined) {
r.after(parseTokenValue(TOKENTYPES.time));
r.time();
} else {
r.after(parseTokenValue(TOKENTYPES.rank));
parseTimePeriod(r);
}
break;
case TOKENTYPES.before:
if (peek(TOKENTYPES.time).type !== undefined) {
r.before(parseTokenValue(TOKENTYPES.time));
r.time();
} else {
r.before(parseTokenValue(TOKENTYPES.rank));
parseTimePeriod(r);
}
break;
case TOKENTYPES.onthe:
parseOnThe(r);
break;
case TOKENTYPES.on:
r.on(parseRanges(TOKENTYPES.dayName)).dayOfWeek();
break;
case TOKENTYPES.of:
r.on(parseRanges(TOKENTYPES.monthName)).month();
break;
case TOKENTYPES["in"]:
r.on(parseRanges(TOKENTYPES.yearIndex)).year();
break;
case TOKENTYPES.at:
r.on(parseTokenValue(TOKENTYPES.time)).time();
while (checkAndParse(TOKENTYPES.and)) {
r.on(parseTokenValue(TOKENTYPES.time)).time();
}
break;
case TOKENTYPES.and:
break;
case TOKENTYPES.also:
r.and();
break;
case TOKENTYPES.except:
r.except();
break;
default:
error = pos;
}
}
return {
schedules: r.schedules,
exceptions: r.exceptions,
error: error
};
}