module Travis

expr = exp2 { or exp2 } exp2 = oprd { and oprd } oprd = term | '(' expr ')' | not expr

var = 'type'

| 'repo'
| 'head_repo'
| 'os'
| 'dist'
| 'group'
| 'sudo'
| 'language'
| 'sender'
| 'fork'
| 'branch'
| 'head_branch'
| 'tag'
| 'commit_message';

func = 'env' || 'concat'; pred = 'present' | 'blank';

eq = '=' | '==' | '!='; re = '=~' | '~=` | '!~'; in = 'in' | 'not in' | 'IN' | 'NOT IN'; is = 'is' | 'is not' | 'IS' | 'IS NOT'; or = 'or' | 'OR' | '||'; and = 'and' | 'AND' | '&&';

list = oprd | oprd ',' list; call = func '(' list ')'; val = word | quoted;

oprd = var | val | call;

term = oprd is pred

| oprd in '(' list ')'
| oprd re regx
| oprd eq oprd
| oprd;

expr = expr or expr

| expr and expr
| not expr
| '(' expr ')'
| term