So at first you think:
To_Do_Item ::= Done Item
Done ::= boolean
Item ::= String
But then you think:
To_Do_Item ::= Done Item Due
Due ::= DateTime
And then you think:
Due ::= DateTime | RecurrencePattern | DatePattern
DatePattern -- “next Tuesday” “3rd Fridays of the Month” etc...
And you're also thinking:
To_Do_Item ::= ~~Done~~ Status Item
Status ::= Done | Pending | Deferred| Waiting | Overdue | Next Action | Urgent
And what about “Every 3 months or 3,000 miles”? And how to distinguish between "If it's overdue, it's over," ("attend the concert,") "Due any time in a range," ("get a haircut,"), and "If it's overdue, it becomes more urgent."?
And wouldn't a To-Do List DSL be able to describe things like “Your goal is to exercise 40 minutes per day, but 40 minutes every other day is marginally acceptable. But if you don't exercise at all for five days in a row, you've got to get out of the house.”?
There are no easy domains...