
# This is a full BNF grammar for the task command line.  It is intended that a
# future release of task will incorporate a complete lexer/parser implementing
# this grammar, which will allow for more sophisticated command lines, for
# example:
#
#    task delete 1 2 4-7
#    task add pri:H pro:X -- pro pri 1 ///
#

command     ::= simple_command
              | filter_command filter?
              | id_command
              | "export" file
              | <id>
              | <id> <substitution> ;

simple_command ::= "version" | "help" | "projects" | "tags" | "next" | "stats"
                 | "color" ;

filter_command ::= "summary" | "history" | "calendar" | "active" | "overdue"
                 | "oldest" | "newest" | "add" | "list" | "long" | "ls"
                 | "completed" ;

id_command ::= "delete" | "undelete" | "info" | "start" | "end" | "done"
             | "undo" ;

filter      ::= filter_part+ ;

filter_part ::= tag_add | tag_remove | attribute | word ;

tag_add     ::= "+" word ;
tag_remove  ::= "-" word ;
attribute   ::= word ":" word ;
word        ::=
file        ::=
id          ::= digit+ ;
digit       ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
substitution ::= "/" word+ "/" word* "/" "g"? ;

