Formal syntax of query expressions
QueryExpression := ZettelList? QueryDirective* SearchExpression ActionExpression?
ZettelList := (ZID (SPACE+ ZID)*).
ZID := '0'+ ('1' .. '9'') DIGIT*
| ('1' .. '9') DIGIT*.
QueryDirective := ContextDirective
| IdentDirective
| ItemsDirective
| UnlinkedDirective.
ContextDirective := "CONTEXT" (SPACE+ ContextDetail)*.
ContextDetail := "FULL"
| "BACKWARD"
| "FORWARD"
| "COST" SPACE+ PosInt
| "MAX" SPACE+ PosInt.
IdentDirective := IDENT.
ItemsDirective := ITEMS.
UnlinkedDirective := UNLINKED (SPACE+ PHRASE SPACE+ Word)*.
SearchExpression := SearchTerm (SPACE+ SearchTerm)*.
SearchTerm := SearchOperator? SearchValue
| SearchKey SearchOperator SearchValue?
| SearchKey ExistOperator
| "OR"
| "RANDOM"
| "PICK" SPACE+ PosInt
| "ORDER" SPACE+ ("REVERSE" SPACE+)? SearchKey
| "OFFSET" SPACE+ PosInt
| "LIMIT" SPACE+ PosInt.
SearchValue := Word.
SearchKey := MetadataKey.
SearchOperator := '!'
| ('!')? ('~' | ':' | '[' | '}').
ExistOperator := '?'
| '!' '?'.
PosInt := '0'
| ('1' .. '9') DIGIT*.
ActionExpression := '|' (Word (SPACE+ Word)*)?
Action := Word
| 'ATOM'
| 'KEYS'
| 'N' NO-SPACE*
| 'MAX' PosInt
| 'MIN' PosInt
| 'REDIRECT'
| 'REINDEX'
| 'RSS'
| 'TITLE' (SPACE Word)* .
Word := NO-SPACE NO-SPACE*