-
Notifications
You must be signed in to change notification settings - Fork 4
/
grammar
113 lines (94 loc) · 3.05 KB
/
grammar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
Best practices:
Have one state per physical state.
Have one state per orthogonal intended state of the system.
Have buttons for each valid transition of physical states or intended states.
Have behaviours for each combination of physical states and intended states where something interesting can happen.
---------------------
<id>: state {
// any number of any of the following:
<value> [<condition-or-time-range>];
...
}
<id>: button 'label' [<condition-or-time-range>] [highlight <condition-or-time-range>] {
set <state> to <value>;
imply <button>; // also clicks that button for you
...;
}
<id>: behaviour [<condition-or-time-range>] {
message 'message';
class 'class';
class 'class' <condition>;
promote <button>;
escalate immediately;
escalate after <duration> [after <event>];
escalate every <time-unit> [after <event>];
escalate every <duration> [after <event>];
...;
}
<id>: todo 'label' [<condition-or-time-range>] {
select <condition-or-time-range>;
lasts <duration>;
class 'class';
class 'class' <condition>;
}
<condition-or-time-range>:
when <condition>
<time-range>
<condition>:
<condition-element>
<condition-element> <and-condition-element>
<condition-element> <or-condition-element>
<condition-element> <time-range>
<and-condition-element>:
<condition-element>
<condition-element> and <and-condition-element>
<or-condition-element>:
<condition-element>
<condition-element> or <or-condition-element>
<condition-element>:
<behaviour>
not <behaviour>
<todo> is relevant
<todo> is not relevant
<todo> is done
<todo> is not done
<state> is <value>
<state> is not <value>
<event> before <event>
<event> after <event>
<event> over <duration> ago
<event> under <duration> ago
(<condition>)
(<time-range>)
not (<condition>)
not (<time-range>)
<event>
<state> changed
<button> pressed
<behaviour> triggered
<time-range>
between <repeating-time> and <repeating-time>
for <duration> after <repeating-time>
<time-unit>: week, weeks, day, days, hour, hours, minute, minutes, second, seconds
<duration>
<n> <time-unit>
; omitting the hours/minutes implies midnight
; so "between mondays and tuesdays" really means "for 24 hours after mondays at 00:00"
; omitting <day> after <monthname> implies the first of the month
; so "between january and february" really means all of january
<repeating-time>:
first <dayname> [at <hour>:<min>]
second <dayname> [at <hour>:<min>]
third <dayname> [at <hour>:<min>]
fourth <dayname> [at <hour>:<min>]
fifth <dayname> [at <hour>:<min>]
alternating <dayname>s (starting <year>-<month>-<day>) [at <hour>:<min>]
every <duration> starting [<dayname>] <year>-<month>-<day> at <hour>:<min>
every <time-unit> starting [<dayname>] <year>-<month>-<day> at <hour>:<min>
<dayname>s [at <hour>:<min>]
<monthname> [<day>] [at <hour>:<min>] ; "february 29" not allowed
<duration> before <repeating-time>
at <hour>:<min>
<year>, <month>, <day>, <hour>, <min>: integers in appropriate range
<dayname>: monday, tuesday, etc
<monthname>: january, february, etc