FQL Grammar
From Facebook Developer Wiki
This is the grammar file we use to parse FQL statements. CAPS indicate terminal expressions as recognized by the tokenizer.
start ::= statement opt_semicolon.
opt_semicolon ::= SEMICOLON.
opt_semicolon ::= .
statement ::= SELECT expression_list FROM IDENT WHERE disjunction opt_order opt_limit.
opt_order ::= ORDER BY expression opt_desc.
opt_order ::= .
opt_desc ::= DESC.
opt_desc ::= ASC.
opt_desc ::= .
opt_limit ::= LIMIT INT COMMA INT.
opt_limit ::= LIMIT INT opt_offset.
opt_limit ::= .
opt_offset ::= OFFSET INT.
opt_offset ::= .
expression_list ::= disjunction.
expression_list ::= expression_list COMMA disjunction.
disjunction ::= conjunction.
disjunction ::= disjunction OR conjunction.
conjunction ::= expression.
conjunction ::= conjunction AND expression.
expression ::= expression CMP sum.
expression ::= sum IN OPEN_PAREN statement CLOSE_PAREN.
expression ::= sum IN OPEN_PAREN expression_list CLOSE_PAREN.
expression ::= sum IN OPEN_PAREN CLOSE_PAREN.
expression ::= sum IN term.
expression ::= sum.
sum ::= sum ADD_OP prod.
sum ::= prod.
prod ::= prod STAR big_term.
prod ::= prod SLASH big_term.
prod ::= big_term.
big_term ::= OPEN_PAREN disjunction CLOSE_PAREN.
big_term ::= NOT big_term.
big_term ::= term.
term ::= IDENT.
term ::= constant.
term ::= IDENT OPEN_PAREN expression_list CLOSE_PAREN.
term ::= IDENT OPEN_PAREN CLOSE_PAREN.
constant ::= INT.
constant ::= STRING.
In actuality, the "statement" production is slightly more complex in order to flag some common errors:
statement ::= SELECT star_catching_expr_list FROM IDENT WHERE disjunction opt_order opt_limit.
statement ::= SELECT star_catching_expr_list. // Error: FROM and WHERE clauses are required
statement ::= SELECT star_catching_expr_list FROM IDENT. // Error: WHERE clause is required.
star_catching_expr_list ::= STAR. // Error: SELECT * not supported
star_catching_expr_list ::= star_catching_expr_list COMMA STAR. // Error: SELECT * not supported
star_catching_expr_list ::= disjunction.
star_catching_expr_list ::= star_catching_expr_list COMMA disjunction.
