/* * * Lexer definitions * */ |
<DEFAULT> SKIP : {
" "
| "\t"
| "\n"
| "\r"
| "\f"
}
|
<DEFAULT> SPECIAL : {
<SINGLE_LINE_COMMENT: "//" (~["\n","\r"])* ("\n" | "\r" | "\r\n")>
| <FORMAL_COMMENT: "/**" (~["*"])* "*" ("*" | ~["*","/"] (~["*"])* "*")* "/">
| <MULTI_LINE_COMMENT: "/*" (~["*"])* "*" ("*" | ~["*","/"] (~["*"])* "*")* "/">
}
|
<DEFAULT> TOKEN [IGNORE_CASE] : {
<ADD: "ADD">
| <ALL: "ALL">
| <AND: "AND">
| <ANNOUNCE: "ANNOUNCE">
| <ARRAY: "ARRAY">
| <AS: "AS">
| <ASC: "ASC">
| <AVG: "AVG">
| <AVGD: "AVGD">
| <BASE: "BASE">
| <BEGIN: "BEGIN">
| <BUT: "BUT">
| <BY: "BY">
| <CALL: "CALL">
| <CASE: "CASE">
| <COMMIT: "COMMIT">
| <COMPOSE: "COMPOSE">
| <CONSTRAINT: "CONSTRAINT">
| <COUNT: "COUNT">
| <COUNTD: "COUNTD">
| <DELETE: "DELETE">
| <DESC: "DESC">
| <DIVIDEBY: "DIVIDEBY">
| <DO: "DO">
| <DROP: "DROP">
| <D_INSERT: "D_INSERT">
| <D_UNION: "D_UNION">
| <ELSE: "ELSE">
| <END: "END">
| <EOT: "<EOT>">
| <EXACTLYD: "EXACTLYD">
| <EXACTLY: "EXACTLY">
| <EXECUTE: "EXECUTE">
| <EXTEND: "EXTEND">
| <EXTERNAL: "EXTERNAL">
| <FALSE: "FALSE">
| <FOREIGN: "FOREIGN"> : SCRIPT
| <FOR: "FOR">
| <FROM: "FROM">
| <GROUP: "GROUP">
| <I_DELETE: "I_DELETE">
| <I_MINUS: "I_MINUS">
| <IF: "IF">
| <IN: "IN">
| <INIT: "INIT">
| <INSERT: "INSERT">
| <INTERSECT: "INTERSECT">
| <IS: "IS">
| <JOIN: "JOIN">
| <KEY: "KEY">
| <LEAVE: "LEAVE">
| <LOAD: "LOAD">
| <LAMBDA: "~[">
| <LAMBDAEND: "]~">
| <MATCHING: "MATCHING">
| <MAX: "MAX">
| <MIN: "MIN">
| <MINUS: "MINUS">
| <NOT: "NOT">
| <OPERATOR: "OPERATOR">
| <ORDER: "ORDER">
| <ORDERED: "ORDERED">
| <ORDINAL: "ORDINAL">
| <OR: "OR">
| <OUTPUT: "OUTPUT">
| <PER: "PER">
| <POSSREP: "POSSREP">
| <PREFIX: "PREFIX">
| <PRIVATE: "PRIVATE">
| <PUBLIC: "PUBLIC">
| <REAL: "REAL">
| <RELATION: "RELATION" | "REL">
| <RENAME: "RENAME">
| <RETURN: "RETURN">
| <RETURNS: "RETURNS">
| <ROLLBACK: "ROLLBACK">
| <SAME_HEADING_AS: "SAME_HEADING_AS">
| <SAME_TYPE_AS: "SAME_TYPE_AS">
| <SET: "SET">
| <SEMIJOIN: "SEMIJOIN">
| <SEMIMINUS: "SEMIMINUS">
| <SUFFIX: "SUFFIX">
| <SUMD: "SUMD">
| <SUMMARIZE: "SUMMARIZE">
| <SUM: "SUM">
| <SYNONYMS: "SYNONYMS">
| <TABLE_DEE: "DEE" | "TABLE_DEE">
| <TABLE_DUM: "DUM" | "TABLE_DUM">
| <TCLOSE: "TCLOSE">
| <THEN: "THEN">
| <TIMES: "TIMES">
| <TO: "TO">
| <TRANSACTION: "TRANSACTION">
| <TRUE: "TRUE">
| <TUPLE: "TUPLE" | "TUP">
| <TYPE: "TYPE">
| <UNGROUP: "UNGROUP">
| <UNION: "UNION">
| <UNWRAP: "UNWRAP">
| <UPDATES: "UPDATES">
| <UPDATE: "UPDATE">
| <VAR: "VAR">
| <VERSION: "VERSION">
| <VIRTUAL: "VIRTUAL" | "VIEW">
| <WHEN: "WHEN">
| <WHERE: "WHERE">
| <WHILE: "WHILE">
| <WITH: "WITH">
| <WRAP: "WRAP">
| <WRITE: "WRITE">
| <WRITELN: "WRITELN">
| <XOR: "XOR">
| <XUNION: "XUNION">
}
|
<DEFAULT> TOKEN : {
<INTEGER_LITERAL: <DECIMAL_LITERAL> (["l","L"])? | <HEX_LITERAL> (["l","L"])? | <OCTAL_LITERAL> (["l","L"])?>
| <#DECIMAL_LITERAL: ["1"-"9"] (["0"-"9"])*>
| <#HEX_LITERAL: "0" ["x","X"] (["0"-"9","a"-"f","A"-"F"])+>
| <#OCTAL_LITERAL: "0" (["0"-"7"])*>
| <FLOATING_POINT_LITERAL: (["0"-"9"])+ "." (["0"-"9"])* (<EXPONENT>)? (["f","F","d","D"])? | "." (["0"-"9"])+ (<EXPONENT>)? (["f","F","d","D"])? | (["0"-"9"])+ <EXPONENT> (["f","F","d","D"])? | (["0"-"9"])+ (<EXPONENT>)? ["f","F","d","D"]>
| <#EXPONENT: ["e","E"] (["+","-"])? (["0"-"9"])+>
| <STRING_LITERAL: "\"" (~["\"","\\","\n","\r"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"]))* "\"" | "\'" (~["\'","\\","\n","\r"] | "\\" (["n","t","b","r","f","\\","\'","\""] | ["0"-"7"] (["0"-"7"])? | ["0"-"3"] ["0"-"7"] ["0"-"7"]))* "\'">
}
|
<DEFAULT> TOKEN : {
<IDENTIFIER: <LETTER> (<LETTER> | <DIGIT> | "." | "#")*>
| <#LETTER: ["$","A"-"Z","_","a"-"z","\u00c0"-"\u00d6","\u00d8"-"\u00f6","\u00f8"-"\u00ff","\u0100"-"\u1fff","\u3040"-"\u318f","\u3300"-"\u337f","\u3400"-"\u3d2d","\u4e00"-"\u9fff","\uf900"-"\ufaff"]>
| <#DIGIT: ["0"-"9","\u0660"-"\u0669","\u06f0"-"\u06f9","\u0966"-"\u096f","\u09e6"-"\u09ef","\u0a66"-"\u0a6f","\u0ae6"-"\u0aef","\u0b66"-"\u0b6f","\u0be7"-"\u0bef","\u0c66"-"\u0c6f","\u0ce6"-"\u0cef","\u0d66"-"\u0d6f","\u0e50"-"\u0e59","\u0ed0"-"\u0ed9","\u1040"-"\u1049"]>
}
|
<DEFAULT> TOKEN : {
<LPAREN: "(">
| <RPAREN: ")">
| <LBRACE: "{">
| <RBRACE: "}">
| <SEMICOLON: ";">
| <COMMA: ",">
| <COLON: ":">
}
|
<DEFAULT> TOKEN : {
<ASSIGN: ":=">
| <EQ: "=">
| <GT: ">">
| <LT: "<">
| <LTE: "<=">
| <GTE: ">=">
| <NEQ: "<>">
| <PLUS: "+">
| <SUBT: "-">
| <STAR: "*">
| <SLASH: "/">
}
|
<SCRIPT> TOKEN : {
<ENDFOREIGN: "\nEND"> : DEFAULT
| <TEXT: ~[]>
}
|
| evaluate | ::= | ( compound_statement_body ";" )? expression ( <EOT> | <EOF> ) |
| code | ::= | statement ( statement )* ( <EOT> | <EOF> ) |
| statement | ::= | statement_body ";" |
| op_before_returns | ::= | <OPERATOR> identifier "(" ( identifier type_ref ( "," identifier type_ref )* )? ")" |
| op_after_returns | ::= | op_updates op_synonym op_version ";" op_body <END> <OPERATOR> |
| | | identifier <FOREIGN> ( <TEXT> )* <ENDFOREIGN> <OPERATOR> |
| getoperatorreturntype | ::= | op_before_returns op_returns op_after_returns |
| getheading | ::= | heading |
| getsignature | ::= | op_signature op_returns |
| statement_body | ::= | assignment |
| | | loop | |
| | | op_def | |
| | | type_def | |
| | | drop | |
| | | var_def | |
| | | db_constraint_def | |
| | | relation_array_load | |
| | | begin_transaction | |
| | | compound_statement_body | |
| | | commit | |
| | | rollback | |
| | | call | |
| | | return_statement | |
| | | case_statement | |
| | | if_statement | |
| | | leave | |
| | | write | |
| | | writeln | |
| | | output | |
| | | announce | |
| | | execute | |
| | | set |
/* Rel extension - non-TTM */
| write | ::= | <WRITE> expression |
/* Rel extension - non-TTM */
| writeln | ::= | <WRITELN> ( expression )? |
/* Rel extension - non-TTM */
| output | ::= | <OUTPUT> expression |
/* Rel extension - non-TTM */
| announce | ::= | <ANNOUNCE> string_literal |
/* Rel extension - non-TTM */
| execute | ::= | <EXECUTE> expression |
/* Rel extension - non-TTM */
| set | ::= | <SET> identifier identifier |
| compound_statement_body | ::= | <BEGIN> ";" ( statement )* <END> |
| op_def | ::= | <OPERATOR> identifier "(" parameter_def_commalist ")" op_returns ( rel_op_def | external_op_def ) |
| lambda | ::= | <OPERATOR> lambda_definition <END> <OPERATOR> |
| | | <LAMBDA> lambda_definition <LAMBDAEND> |
| lambda_definition | ::= | "(" parameter_def_commalist ")" <RETURNS> type_ref ";" op_body |
| external_op_def | ::= | identifier <FOREIGN> ( <TEXT> )* <ENDFOREIGN> <OPERATOR> |
| rel_op_def | ::= | op_updates op_synonym op_version ";" op_body <END> <OPERATOR> |
/* Note: op_returns() and op_updates() should be mutually exclusive. */
| op_returns | ::= | ( <RETURNS> type_ref )? |
| op_updates | ::= | ( <UPDATES> "{" ( <ALL> <BUT> parameter_name_commalist )? "}" )? |
| op_synonym | ::= | ( synonym_def )? |
| op_version | ::= | ( <VERSION> identifier )? |
| op_body | ::= | ( statement )? |
| return_statement | ::= | <RETURN> ( expression )? |
/* Not explicitly defined in TTM3 */
| parameter_def_commalist | ::= | ( parameter_def ( "," parameter_def )* )? |
| parameter_def | ::= | identifier type_ref |
/* Not explicitly defined in TTM3 */
| parameter_name_commalist | ::= | ( identifier ( "," identifier )* )? |
| synonym_def | ::= | <SYNONYMS> "{" user_op_name_commalist "}" |
/* Not explicitly defined in TTM3 */
| user_op_name_commalist | ::= | identifier ( "," identifier )* |
/* Inclusion of type_ref_commalist() in OPERATOR DROP is not per TTM3, but necessary to disambiguate operators. */
| drop | ::= | <DROP> ( <OPERATOR> op_signature | <VAR> identifier | <CONSTRAINT> identifier | <TYPE> identifier ) |
| op_signature | ::= | identifier "(" type_ref_commalist ")" |
| op_type | ::= | <OPERATOR> "(" type_ref_commalist ")" ( <RETURNS> type_ref )? |
| type_ref_commalist | ::= | ( type_ref ( "," type_ref )* )? |
/* Was user_scalar_type_def */
| type_def | ::= | <TYPE> identifier type_def_kind |
| type_def_kind | ::= | type_def_external |
| | | type_def_internal |
| type_def_external | ::= | identifier <FOREIGN> ( <TEXT> )* <ENDFOREIGN> <TYPE> |
/* User-defined (internal) types start here */
| type_def_internal | ::= | type_def_internal_ordinal type_def_internal_union type_def_internal_is_or_possrep |
| type_def_internal_is_or_possrep | ::= | is_def |
| | | possrep_def_list |
| type_def_internal_ordinal | ::= | ( type_def_internal_opt_ordinal )? |
| type_def_internal_opt_ordinal | ::= | ( <ORDINAL> | <ORDERED> ) |
| type_def_internal_union | ::= | ( type_def_internal_opt_union )? |
| type_def_internal_opt_union | ::= | <UNION> |
| is_def | ::= | <IS> "{" ( single_inheritance_is_def | multiple_inheritance_is_def ) "}" |
| single_inheritance_is_def | ::= | identifier possrep_or_specialization_details |
| possrep_or_specialization_details | ::= | specialisation_constraint_def ( derived_possrep_def_list )? |
| | | possrep_def_list |
| multiple_inheritance_is_def | ::= | scalar_type_name_commalist derived_possrep_def_list |
/* Not explicitly defined in TTM3 */
| scalar_type_name_commalist | ::= | scalar_type_name ( "," scalar_type_name )* |
| scalar_type_name | ::= | identifier |
/* Not explicitly defined in TTM3 */
| possrep_def_list | ::= | ( possrep_def )* possrep_opt_initialiser |
/* Not defined in TTM3. For explicitly setting values of components not in the current possrep. Only required by types with multiple possreps. Takes the place of "highly protected operators not part of D". (pg 382, etc.) */
| possrep_opt_initialiser | ::= | ( <INIT> possrep_initialiser_assignments ( possrep_initialiser_assignments )* )? |
/* Not defined in TTM3, as per above. Identifier should be existing POSSREP name. */
| possrep_initialiser_assignments | ::= | identifier "(" assignment ")" |
| possrep_def | ::= | <POSSREP> possrep_def_identifier "{" possrep_component_def_commalist possrep_opt_constraint_def "}" |
| possrep_def_identifier | ::= | ( identifier )? |
| possrep_opt_constraint_def | ::= | ( constraint_def )? |
/* Not explicitly defined in TTM3 */
| possrep_component_def_commalist | ::= | ( possrep_component_def ( "," possrep_component_def )* )? |
| possrep_component_def | ::= | identifier type_ref |
/* Expression must be boolean */
| constraint_def | ::= | <CONSTRAINT> expression |
/* Expression must be boolean */
| specialisation_constraint_def | ::= | <CONSTRAINT> expression |
/* Not explicitly defined in TTM3 */
| derived_possrep_def_list | ::= | derived_possrep_def ( derived_possrep_def )* |
| derived_possrep_def | ::= | <POSSREP> derived_possrep_def_opt_identifier "{" derived_possrep_component_def_commalist "}" |
| derived_possrep_def_opt_identifier | ::= | ( identifier )? |
/* Not explicitly defined in TTM3 */
| derived_possrep_component_def_commalist | ::= | derived_possrep_component_def ( "," derived_possrep_component_def )* |
| derived_possrep_component_def | ::= | identifier "=" identifier "(" identifier ")" |
/* End user-defined types (internal) */ /* Includes scalar_var_def, relation_var_def, array_var_def and tuple_var_def */
| var_def | ::= | <VAR> identifier ( var_scalar_or_tuple | var_array | var_relvar ) |
| var_relvar | ::= | ( <REAL> | <BASE> ) var_type_or_init_value var_keydeflist |
| | | <PRIVATE> var_type_or_init_value var_keydeflist | |
| | | <PUBLIC> type_ref var_keydeflist | |
| | | <VIRTUAL> expression var_keydeflistoptional | |
| | | var_relvar_external |
| var_relvar_external | ::= | <EXTERNAL> identifier string_literal ( identifier )? |
| var_keydeflist | ::= | var_keydef ( var_keydef )* |
| var_keydeflistoptional | ::= | ( var_keydef )* |
| var_keydef | ::= | <KEY> "{" attribute_name_list "}" |
| var_scalar_or_tuple | ::= | var_type_or_init_value |
| var_type_or_init_value | ::= | var_type_and_optional_init |
| | | var_init |
| var_type_and_optional_init | ::= | type_ref ( <INIT> "(" expression ")" )? |
| var_init | ::= | <INIT> "(" expression ")" |
| var_array | ::= | <ARRAY> type_ref |
| db_constraint_def | ::= | <CONSTRAINT> identifier expression |
/* type -- scalar_type, tuple_type, relation_type */
| type_ref | ::= | identifier |
| | | type_same_type_as | |
| | | tuple_type | |
| | | relation_type | |
| | | op_type |
| type_same_type_as | ::= | <SAME_TYPE_AS> "(" expression ")" |
| tuple_type | ::= | <TUPLE> heading_type |
| relation_type | ::= | <RELATION> heading_type |
| heading_type | ::= | heading |
| | | same_heading_as |
| same_heading_as | ::= | <SAME_HEADING_AS> "(" expression ")" |
| relation_array_load | ::= | <LOAD> identifier <FROM> expression |
| begin_transaction | ::= | <BEGIN> <TRANSACTION> |
| commit | ::= | <COMMIT> |
| rollback | ::= | <ROLLBACK> |
| case_statement | ::= | <CASE> ";" when_def_list case_else <END> <CASE> |
| when_def_list | ::= | when_def ( when_def )* |
| when_def | ::= | <WHEN> expression <THEN> statement |
| case_else | ::= | ( <ELSE> statement )? |
/* Note that THEN and ELSE are not followed by semicolons, but maybe should be? */
| if_statement | ::= | <IF> expression <THEN> statement if_statement_else <END> <IF> |
| if_statement_else | ::= | ( <ELSE> statement )? |
| loop | ::= | ( identifier ":" )? ( do_statement | while_statement | for_statement ) |
| do_statement | ::= | <DO> identifier ":=" expression <TO> expression ";" statement <END> <DO> |
| while_statement | ::= | <WHILE> expression ";" statement <END> <WHILE> |
| for_statement | ::= | <FOR> expression ";" statement <END> <FOR> |
| leave | ::= | <LEAVE> identifier |
| call | ::= | <CALL> identifier "(" arglist ")" |
| assignment | ::= | assign ( "," assign )* |
| assign | ::= | identifier ":=" expression |
| | | <INSERT> identifier expression | |
| | | <D_INSERT> identifier expression | |
| | | <DELETE> identifier delete_parameter | |
| | | <I_DELETE> identifier expression | |
| | | <UPDATE> identifier update_where ":" update_assignment |
| delete_parameter | ::= | ( ( <WHERE> )? expression )? |
| update_where | ::= | ( <WHERE> expression )? |
| update_assignment | ::= | "{" assignment "}" |
/* Expressions */
| expression | ::= | ( attribute_from | basic_expression | tuple_from | with | tclose ) |
| attribute_from | ::= | identifier <FROM> expression |
| tuple_from | ::= | <TUPLE> <FROM> expression |
| with | ::= | <WITH> "(" name_intro_commalist ")" ":" expression |
| name_intro_commalist | ::= | name_intro ( "," name_intro )* |
| name_intro | ::= | identifier ":=" expression |
| tclose | ::= | <TCLOSE> expression |
| basic_expression | ::= | order_expression ( "[" expression "]" | "(" arglist ")" )? |
| order_expression | ::= | where_expression ( <ORDER> "(" order_item_commalist ")" )? |
| where_expression | ::= | or_expression ( <WHERE> or_expression )? |
| or_expression | ::= | xor_expression ( <OR> xor_expression )* |
| xor_expression | ::= | and_expression ( <XOR> and_expression )* |
| and_expression | ::= | compare_expression ( <AND> compare_expression )* |
| compare_expression | ::= | rel_diadic ( "=" rel_diadic | "<>" rel_diadic | ">=" rel_diadic | "<=" rel_diadic | ">" rel_diadic | "<" rel_diadic | <IN> rel_diadic )? |
| rel_diadic | ::= | rel_monadic ( <UNION> rel_monadic | <XUNION> rel_monadic | <D_UNION> rel_monadic | <INTERSECT> rel_monadic | <MINUS> rel_monadic | <I_MINUS> rel_monadic | <JOIN> rel_monadic | <TIMES> rel_monadic | <COMPOSE> rel_monadic | ( <SEMIJOIN> | <MATCHING> ) rel_monadic | ( <SEMIMINUS> | <NOT> <MATCHING> ) rel_monadic )* |
| rel_monadic | ::= | rel_project ( <RENAME> "{" renaming_commalist "}" | <WRAP> wrapping | <UNWRAP> identifier | <GROUP> grouping | <UNGROUP> identifier | <DIVIDEBY> expression <PER> "(" expression divide_per_optional ")" )? |
/* Not explicitly defined in TTM3 */
| order_item_commalist | ::= | ( order_item ( "," order_item )* )? |
| order_item | ::= | <ASC> identifier |
| | | <DESC> identifier |
| divide_per_optional | ::= | ( "," expression )? |
| rel_project | ::= | add_expression ( "{" attribute_name_list "}" )? |
| grouping | ::= | "{" attribute_name_list "}" <AS> identifier |
| wrapping | ::= | "{" attribute_name_list "}" <AS> identifier |
| renaming_commalist | ::= | ( renaming ( "," renaming )* )? |
| renaming | ::= | renaming_simple |
| | | renaming_prefix | |
| | | renaming_suffix |
| renaming_simple | ::= | identifier <AS> identifier |
| renaming_prefix | ::= | <PREFIX> string_literal <AS> string_literal |
| renaming_suffix | ::= | <SUFFIX> string_literal <AS> string_literal |
| attribute_name_list | ::= | optional_all_but attribute_name_commalist |
| optional_all_but | ::= | ( <ALL> <BUT> )? |
| attribute_name_commalist | ::= | ( identifier ( "," identifier )* )? |
| add_expression | ::= | mul_expression ( "+" mul_expression | "-" mul_expression | "||" mul_expression )* |
| mul_expression | ::= | unary_expression ( "*" unary_expression | "/" unary_expression )* |
| unary_expression | ::= | <NOT> unary_expression |
| | | "+" unary_expression | |
| | | "-" unary_expression | |
| | | primary_expression |
| primary_expression | ::= | literal |
| | | aggregate_operator | |
| | | exactly | |
| | | nadic_or | |
| | | nadic_xor | |
| | | nadic_and | |
| | | nadic_union | |
| | | nadic_xunion | |
| | | nadic_disjoint_union | |
| | | nadic_intersect | |
| | | nadic_join | |
| | | nadic_times | |
| | | nadic_compose | |
| | | nadic_count | |
| | | nadic_sum | |
| | | nadic_avg | |
| | | nadic_max | |
| | | nadic_min | |
| | | extend | |
| | | summarize | |
| | | substitute | |
| | | case_expression | |
| | | if_expression | |
| | | fn_invoke | |
| | | dereference | |
| | | "(" expression ")" |
| case_expression | ::= | <CASE> when_def_list_expr <ELSE> expression <END> <CASE> |
| when_def_list_expr | ::= | when_def_expr ( when_def_expr )* |
| when_def_expr | ::= | <WHEN> expression <THEN> expression |
| if_expression | ::= | <IF> expression <THEN> expression <ELSE> expression <END> <IF> |
/* Update expression, *not* assignment. Contents of expression() does not change! */
| substitute | ::= | <UPDATE> expression ":" update_assignment |
| nadic_optional_heading | ::= | heading "{" heading_exp_commalist "}" |
| | | "{" heading_exp_commalist "}" |
| nadic_union | ::= | <UNION> nadic_optional_heading |
| nadic_xunion | ::= | <XUNION> nadic_optional_heading |
| nadic_disjoint_union | ::= | <D_UNION> nadic_optional_heading |
| nadic_intersect | ::= | <INTERSECT> nadic_optional_heading |
| nadic_join | ::= | <JOIN> "{" heading_exp_commalist "}" |
| nadic_times | ::= | <TIMES> "{" heading_exp_commalist "}" |
| nadic_compose | ::= | <COMPOSE> "{" heading_exp_commalist "}" |
| nadic_or | ::= | <OR> "{" bool_exp_commalist "}" |
| nadic_xor | ::= | <XOR> "{" bool_exp_commalist "}" |
| nadic_and | ::= | <AND> "{" bool_exp_commalist "}" |
| nadic_count | ::= | <COUNT> "{" exp_commalist "}" |
| nadic_sum | ::= | <SUM> "{" exp_commalist "}" |
| nadic_avg | ::= | <AVG> "{" exp_commalist "}" |
| nadic_max | ::= | <MAX> "{" exp_commalist "}" |
| nadic_min | ::= | <MIN> "{" exp_commalist "}" |
| exactly | ::= | <EXACTLY> "(" expression ( "," expression ( "," expression )* )? ")" |
| exp_commalist | ::= | ( expression ( "," expression )* )? |
| bool_exp_commalist | ::= | ( expression ( "," expression )* )? |
| heading_exp_commalist | ::= | ( expression ( "," expression )* )? |
| extend | ::= | <EXTEND> expression ":" "{" extend_add_commalist "}" |
| extend_add_commalist | ::= | extend_add ( "," extend_add )* |
| extend_add | ::= | identifier ":=" expression |
| summarize | ::= | <SUMMARIZE> expression per_or_by ":" "{" summarize_add_commalist "}" |
| per_or_by | ::= | ( <PER> "(" expression ")" | <BY> "{" attribute_name_list "}" )? |
| summarize_add_commalist | ::= | summarize_add ( "," summarize_add )* |
| summarize_add | ::= | identifier ":=" summary |
| summary | ::= | <COUNT> "(" ")" |
| | | <COUNTD> "(" expression ")" | |
| | | <SUM> "(" expression ")" | |
| | | <SUMD> "(" expression ")" | |
| | | <AVG> "(" expression ")" | |
| | | <AVGD> "(" expression ")" | |
| | | <MAX> "(" expression ")" | |
| | | <MIN> "(" expression ")" | |
| | | <AND> "(" expression ")" | |
| | | <OR> "(" expression ")" | |
| | | <XOR> "(" expression ")" | |
| | | <EXACTLY> "(" expression "," expression ")" | |
| | | <EXACTLYD> "(" expression "," expression ")" | |
| | | <UNION> "(" expression ")" | |
| | | <XUNION> "(" expression ")" | |
| | | <D_UNION> "(" expression ")" | |
| | | <INTERSECT> "(" expression ")" |
| fn_invoke | ::= | identifier "(" arglist ")" |
| arglist | ::= | ( expression ( "," expression )* )? |
| aggregate_operator | ::= | <COUNT> "(" expression ")" |
| | | <SUM> "(" expression "," expression ")" | |
| | | <AVG> "(" expression "," expression ")" | |
| | | <MAX> "(" expression "," expression ")" | |
| | | <MIN> "(" expression "," expression ")" | |
| | | <AND> "(" expression "," expression ")" | |
| | | <OR> "(" expression "," expression ")" | |
| | | <XOR> "(" expression "," expression ")" | |
| | | <UNION> "(" expression "," expression ")" | |
| | | <XUNION> "(" expression "," expression ")" | |
| | | <D_UNION> "(" expression "," expression ")" | |
| | | <INTERSECT> "(" expression "," expression ")" |
| literal | ::= | lambda |
| | | tuple | |
| | | relation | |
| | | integer | |
| | | character | |
| | | rational | |
| | | bool |
| tuple | ::= | <TUPLE> "{" ( tuple_component_commalist )? "}" |
| tuple_component_commalist | ::= | tuple_component ( "," tuple_component )* |
| tuple_component | ::= | identifier expression |
| relation | ::= | <RELATION> relation_heading "{" tuple_exp_commalist "}" |
| | | <TABLE_DUM> | |
| | | <TABLE_DEE> |
| relation_heading | ::= | ( heading )? |
| heading | ::= | "{" ( attribute_spec_commalist )? "}" |
| tuple_exp_commalist | ::= | ( expression ( "," expression )* )? |
| attribute_spec_commalist | ::= | attribute_spec ( "," attribute_spec )* |
| attribute_spec | ::= | identifier type_ref |
| identifier | ::= | <IDENTIFIER> |
| dereference | ::= | <IDENTIFIER> |
| character | ::= | <STRING_LITERAL> |
| string_literal | ::= | <STRING_LITERAL> |
| integer | ::= | <INTEGER_LITERAL> |
| rational | ::= | <FLOATING_POINT_LITERAL> |
| bool | ::= | <TRUE> |
| | | <FALSE> |