AQL - - BNF syntax (Version 4_8b)

## AQL - BNF syntax (Version 4_8b)

The syntax for the Acedb query language was developed at the ACE97 workshop (8/8/97) and further refined during implementation and testing. The syntax is given in BNF notation, which is kept in sync with the actual parser of the current AQL version.

The reserved keyword are printed in bold. All additional tokens are quoted in 'single quotes'.

Note that some "factoring" of the grammar has occurred, i.e. the introduction of safe_table.

    query:        table_expr
    	    | query ';' query
    	    | '@' Identifier ':=' table_expr
                | '$' Identifier ':=' expr

    table_expr:   safe_table
    	    | select fieldlist from fwlist
    	    | select all fwlist
    	    | select all from fwlist
    	    | table_expr order                      // default left to right ascending
    	    | table_expr order Ordering
    	    | table_expr order by sortlist
                | table_expr union table_expr
                | table_expr intersect table_expr
                | table_expr diff table_expr   |   table_expr except table_expr

    safe_table:   '(' table_expr ')'
    	    | '@' Identifier

    sortlist:     sort_criterion
                | sortlist ',' sort_criterion

    sort_criterion: ':' Identifier                      // select column by name
                | ':' Number                            // select by column number
    	    | ':' Identifier Ordering
    	    | ':' Number Ordering

    Ordering:     asc                                   // ascending order - default
                | desc                                  // descending order

    fieldlist:    field
    	    | fieldlist ',' field

    field:	      expr
    	    | Identifier '::' expr                  // name alias for field-expression

    fwlist:       fw
                | fw where expr                         // expr is evaluated in boolean context
                | fwlist ',' fw
    	    | fwlist ',' fw where expr              // expr is evaluated in boolean context

    fw:	      basic_decl                            // unnamed declaration
                | Identifier in basic_decl
                | basic_decl as Identifier
                | basic_decl Identifier

    basic_decl:   expr                                  // i.e. a locator or anything that returns a value
    	    | safe_table
                | class Identifier

    locator:      Identifier
                | object '(' expr ',' expr ')'          // create object (class, key)
                | locator '->' Identifier               // follow into object by tag name
                | locator '->' Number                   // follow into object by position
                | locator '[' Identifier ']'            // locate in current object by tag name
                | locator '[' Number ']'                // locate in current object by position
    	    | locator ':' Identifier		    // row variable - select column by name
    	    | locator ':' Number                    // row variable - select column by number
    	    | locator '.' Method                    // locator method
    	    | '->' Identifier                       // unnamed iterator - follow by tag name
    	    | '->' Number                           // unnamed iterator - follow by position
                | '[' Identifier ']'		    // unnamed iterator - locate by tag name
    	    | '[' Number ']'			    // unnamed iterator - locate by position
    	    | ':' Identifier		            // unnamed row variable - select column by name
    	    | ':' Number                            // unnamed row variable - select column by number
    	    | '.' Method                            // unnamed iterator - locator method
    	    | safe_table ':' Identifier		    // table expression - select column by name
    	    | safe_table ':' Number		    // table expression - select column by number

    Comparator:   '=' | '!=' | '<' | '>' | '<=' | '>=' | like

    expr:         locator
    	    | exists locator                        // boolean true/false whether locator value is non-NULL
                | exists '(' locator ')'
    	    | exists_tag locator                    // whether the tag of the locator exists (does not fetch value)
    	    | exists_tag '(' locator ')'
                | '$' Identifier                        // a scalar variable
    	    | StringLiteral                         // test in double-quotes
                | Number
                | FloatLiteral
    	    | Date
    	    | true                                  // i.e. boolean literal
    	    | false
                | expr Comparator expr                  // returns boolean result
                | not expr                              // negates boolean value
                | expr and expr
                | expr or expr
                | expr xor expr
                | expr '+' expr
                | expr '-' expr
                | expr '*' expr
                | expr '/' expr
                | expr '%' expr                         // positive remainder (also 'mod' or 'modulo')
                | '-' expr                              // negative value
                | '(' expr ')'
    	    | mod '(' expr ',' expr ')'             // positive remainder (also '%' or `modulo')
                | abs '(' expr ')'                      // absolute value
                | DateFunc '(' expr ',' expr ')'
    	    | TableFunc safe_table
    	    | TableFunc safe_table ':' Number
    	    | TableFunc safe_table ':' Identifier

    Method:       name                                  // get Object name as Text-type
                | class                                 // get class-Object of Object-value
    	    | length                                // get length of Text-value
                | create_session                        // timestamp-object when the object was created
    	    | create_time                           // same, but as DateType-result
    	    | update_session                        // timestamp-object when the object was last modified
    	    | update_time                           // same, but as DateType-result
    	    | node_session                          // timestamp-object when the tag, or datafields was last added/modified
    	    | node_time                             // same, but as DateType-result

    TableFunc:    count
                | min
                | max
                | sum
                | avg

                | first
                | last

    DateFunc:     yeardiff
                | monthdiff

                | daydiff
                | hourdiff
                | mindiff
                | secdiff

    Identifier:   [A-Za-z][A-Za-z0-9_]*                 // starts with letter, followed by letters or numbers

    Number:       [0-9]+

    FloatLiteral: [0-9]+[eE][+-]?[0-9]+
                | [0-9]+'.'[0-9]*[eE][+-]?[0-9]+
                | '.'[0-9]+[eE][+-]?[0-9]+
                | [0-9]+'.'[0-9]*
                | '.'[0-9]+

    StringLiteral:  \"([^"]|\\["\n])*\"                 // anything enclosed in quotes
                                          // quotes within a string can be escaped by backslash

    Date:	      now                                   // current date/time as YYYY-MM-DD_HH:MM:SS
                | today                                 // current date as YYYY-MM-DD
    	    | DateLiteral

    DateLiteral:  '`'[12][90][0-9][0-9]'-'[01][0-9]'-'[0-3][0-9]'_'[0-2][0-9]':'[0-5][0-9]':'[0-5][0-9]
                | '`'[12][90][0-9][0-9]'-'[01][0-9]'-'[0-3][0-9]'_'[0-2][0-9]':'[0-5][0-9]
                | '`'[12][90][0-9][0-9]'-'[01][0-9]'-'[0-3][0-9]'_'[0-2][0-9]
                | '`'[12][90][0-9][0-9]'-'[01][0-9]'-'[0-3][0-9]
                | '`'[12][90][0-9][0-9]'-'[01][0-9]
                | '`'[12][90][0-9][0-9]