Created
April 4, 2020 16:17
-
-
Save reverendpaco/fc64863d15539349e856a5e1883b73df to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@@grammar::dql | |
############### top markers used by the parser for different contexts | |
start_query | |
= | |
@:top_goal end_marker $ | |
; | |
start_consult | |
= { consultable end_marker }* $ | |
; | |
############################################################ | |
# | |
# Consult-level | |
# | |
# | |
consultable | |
= | |
| datalog_predicate_as_func_form:datalog_predicate_as_func_form | |
| asserted_data_form:asserted_data | |
| datalog_rule_form:datalog_rule | |
| temp_table_form:temp_table | |
; | |
asserted_data | |
= fq_functor:fq_functor "(" ground_terms:ground_datalog_no_under_args ")" | |
; | |
datalog_rule | |
= head_functor:fq_functor head_args:datalog_no_under_args implication ~ rule_body:goal | |
; | |
datalog_predicate_as_func_form | |
= head_functor:fq_functor ":" ~ | |
function_projection:function_projection head_args:datalog_no_under_args implication | |
function_body:function_forms | |
; | |
function_forms | |
= ",".{ (case_statement+:case_statement | |
| format_column_as_function+:format_column_as_function | |
| functional_unification+:functional_unification | |
| scalar_predicate_expression+:scalar_predicate_expression | |
| function_form_alone+:function_form | |
)}+ | |
; | |
functional_unification | |
= | |
| assignment_column:column_name assignment:"=:" case_statement:case_statement | |
| assignment_column:column_name assignment:"=:" scalar_predicate_expression:scalar_predicate_expression | |
| assignment_column:column_name assignment:"=:" function_form:function_form | |
| assignment_column:column_name assignment:"=:" format_column_as_function:format_column_as_function | |
; | |
temp_table | |
= temp_view_name:functor sem_consq temp_view_goal:goal ; | |
ground_datalog_no_under_args | |
= ",".{ground_term}+ | |
; | |
########################################################################################## | |
# | |
# | |
# Query/Repl-level | |
# | |
# | |
top_goal | |
= | |
| cte_form:cte_form | |
| goal_form:goal | |
| assertion | |
; | |
cte_form | |
= cte_prelude:cte_prelude main_goal:goal | |
; | |
cte_prelude | |
= {sem_consq ~ @:cte_pair end_marker}+ | |
; | |
cte_pair | |
= cte_table:cte_table cte_goal:goal; | |
goal | |
= | |
# | |
# ( binary_relational_op | unary_op_with_pipe )%{ relation_or_select }+ ~ | |
binary_part:( binary_relational_op )%{ relation_or_select }+ | |
[ unary_part:{ unary_op_with_pipe }+ post_unary:[binary_relational_op goal] ] | |
; | |
assertion | |
= ("assert" | "insert") "(" assertable:consultable ")" | |
; | |
cte_table | |
= | |
cte_table_name:cte_table_name | |
; | |
cte_table_name | |
= | |
functor:functor [ "(" (",").{column_name:column_name}+ [","] ")" ] | |
; | |
datalog_no_under_args | |
= "(" ",".{@+:head_column}+ ")" | |
; | |
head_column | |
= functional_dependent:[":"] (column_name:column_name | full:full_sigil) | |
; | |
relation_or_select | |
= | |
| selection_stuff:selection_stuff | |
| [alias:alias] named_predicate:named_predicate | |
| [alias:alias] grouped_relation:grouped_relation | |
| [alias:alias] inline_relation:inline_relation | |
| [alias:alias] here_table:here_table | |
; | |
inline_relation | |
= | |
"{{" inline:( /(([^}\\][^}])|(\\})(\\}))+/) "}}" | |
; | |
grouped_relation | |
= | |
| "(" @:grouped_relation ")" # trick to un-nest excessive groupings | |
| "(" @:goal ")" | |
; | |
selection_stuff | |
= | |
| inline_selection:inline_selection | |
#| scalar_predicate_expression: scalar_predicate_expression | |
| scalar_predicate_expression: scalar_predicate_expression | |
; | |
#scalar_predicate_expression_at_top_level | |
# = | |
# | parenthesized_scalar_predicate_expression:( "(" scalar_predicate_expression ")" ) | |
# | lhs:scalar_predicate_side scalar_comparison:sql_scalar_operator rhs:scalar_predicate_side | |
# ; | |
inline_selection | |
= "{" !"{" inline:( /(([^}\\])|(\\}))+/) "}" | |
; | |
here_table | |
= | |
"[" here_table_data:here_table_data "]" here_table_args+:datalog_no_under_args | |
; | |
here_table_data | |
= | |
| mulitple_tuples | |
| one_tuple:one_tuple | |
; | |
mulitple_tuples | |
= ",".{ "[" mulitple_tuples:one_tuple "]" }+ | |
; | |
one_tuple | |
= ",".{ scalar_predicate_expression | function_form | ground_term }+ | |
; | |
################################################################# | |
### | |
### | |
### Named Predicates (i.e. tables or aliases) | |
### | |
### | |
### | |
named_predicate | |
= | |
| globber_named_predicate:globber_named_predicate | |
| embedder_named_predicate:embedder_named_predicate | |
| just_double_glob_predicate:just_double_glob_predicate | |
| just_glob_predicate:just_glob_predicate | |
| datalog_like_named_predicate:datalog_like_named_predicate | |
| projector_named_predicate:projector_named_predicate | |
| eraser_named_predicate:eraser_named_predicate | |
| rename_named_predicate:rename_named_predicate | |
; | |
### | |
globber_named_predicate | |
= | |
fq_functor:fq_functor "(" dimension_globber:dimension_globber ")" | |
; | |
embedder_named_predicate | |
= | |
fq_functor:fq_functor "(" dimension_embedder:dimension_embedder ")" | |
; | |
just_double_glob_predicate | |
= | |
fq_functor:fq_functor "(" "**" ")" | |
; | |
just_glob_predicate | |
= | |
fq_functor:fq_functor "(" "*" ")" | |
; | |
datalog_like_named_predicate | |
= | |
fq_functor:fq_functor "(" (",").{datalog_like_identifiers:datalog_like_identifiers}+ [","] ")" | |
; | |
projector_named_predicate | |
= | |
fq_functor:fq_functor "(" dimension_projector:dimension_projector ")" | |
; | |
eraser_named_predicate | |
= | |
fq_functor:fq_functor "(" dimension_eraser:dimension_eraser ")" | |
; | |
rename_named_predicate | |
= | |
fq_functor:fq_functor "(" rename_selector:rename_selector ")" | |
; | |
### | |
datalog_like_identifiers | |
= | |
| full:full_sigil | |
| ground:ground_term | |
| column_name:column_name | |
; | |
column_index | |
= | |
[column_qualifier:column_qualifier] pound index:index | |
; | |
column_range | |
= | |
[column_qualifier:column_qualifier] pound range:range | |
; | |
fq_column | |
= | |
| [ ns:ns_prefix ] column:column_name | |
| [ ns:ns_prefix ] column:protected_column_name | |
; | |
column_qualifier | |
= [ ns:ns_prefix ] table_or_alias:functor | |
; | |
ns_prefix | |
= { schema:schema period }+ | |
; | |
index | |
= /[1-9]+[0-9]*/ | |
; | |
range | |
= | |
| from:index ".." to:index | |
| ".." to:index | |
| from:index ".." | |
; | |
functor | |
= | |
/[A-Za-z_]+[A-Za-z0-9_]*/ | |
; | |
fq_functor | |
= [ ns:ns_prefix ] just_name:functor | |
; | |
alias | |
= | |
(!"_" @:/[A-Za-z_]+[A-Za-z0-9]*/) at | |
; | |
binary_relational_op | |
= | |
| right_outer_join:right_outer_join | |
| full_outer_join:full_outer_join | |
| left_outer_join:left_outer_join | |
| not_exists:not_exists | |
| exists:exists | |
| intersect:intersect | |
| join:join | |
| union_all:union_all | |
| union:union | |
| excessive_union:excessive_union | |
| flip_except_minus:flip_except_minus | |
| except_minus:except_minus | |
; | |
################################################################# | |
### | |
### | |
### UNARY OPERATIONS | |
### | |
### | |
### | |
unary_op_with_pipe | |
= pipe unary_op:unary_op [ relation_bookmark:relation_bookmark ] | |
; | |
unary_op | |
= | |
| dimension_embedder:dimension_embedder | |
| dimension_eraser:dimension_eraser | |
| dimension_projector:dimension_projector | |
| dimension_globber:dimension_globber | |
| double_glob_selector:double_glob_selector | |
| group_by:group_by [having:having] | |
| distinct:distinct | |
| having:having | |
| limit:limit [order_by:order_by] | |
| order_by:order_by [limit:limit] | |
| rename_selector:rename_selector | |
; | |
### | |
dimension_embedder | |
= "+[" (",").{@+:dimension_embedder_allowed_arguments}+ [","] "]" | |
; | |
dimension_eraser | |
= "-[" (",").{@+:dimension_eraser_allowed_arguments}+ [","] "]" | |
; | |
dimension_projector | |
= "[" (",").{@+:dimension_projection_allowed_arguments}+ "]" | |
; | |
dimension_globber | |
= "*[" (",").{@+:glob_selector_allowed_arguments}+ [","] "]" | |
; | |
double_glob_selector | |
= "(" @:"**" ")" | |
; | |
group_by | |
= "G(" group_by_columns:group_by_columns "," aggregate_functions:aggregate_functions ")" | |
; | |
limit | |
= | |
| int_like | |
| "L(" int_like ")" | |
; | |
order_by | |
= "O(" (",").{@+:order_by_allowed_arguments}+ ")" | |
; | |
distinct | |
= "D(" (",").{distinct_allowed_arguments+:distinct_allowed_arguments}* ")" | |
; | |
having | |
= "H(" having_allowed_arguments+:having_allowed_arguments ")" | |
; | |
rename_selector | |
= "r[" (",").{@+:rename_selector_allowed_arguments}+ "]" | |
; | |
### | |
dimension_embedder_allowed_arguments | |
= | |
| [lvar:lvar_binding] naked_value:ground_term [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] table_as_scalar:table_as_scalar [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] case_statement:case_statement [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] scalar_predicate_expression:scalar_predicate_expression [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] function_form:function_form [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] format_column:format_column [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] column_name:fq_column [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] inline_column:inline_column [ "as" column_rename:column_rename ] | |
; | |
dimension_eraser_allowed_arguments | |
= | |
| column_range:column_range | |
| column_index:column_index | |
| column_name:fq_column | |
| regex_columns:regex_of_regex | |
; | |
dimension_projection_allowed_arguments | |
= | |
# LVARS are not allowed before ranges, duh... nor aliases after | |
| column_range:column_range | |
| mapping_form:mapping_form | |
| [lvar:lvar_binding] naked_value:ground_term [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] table_as_scalar:table_as_scalar [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] scalar_predicate_expression:scalar_predicate_expression [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] case_statement:case_statement [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] function_form:function_form [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] column_index:column_index [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] column_name:fq_column [ "as" column_rename:column_rename ] | |
| [lvar:lvar_binding] inline_column:inline_column [ "as" column_rename:column_rename ] | |
| regex_columns:regex_of_regex | |
; | |
mapping_form | |
= | |
"[" function_to_apply:mapping_function do_as_renaming:do_as_renaming | |
(",").{mapping_form_arguments:mapping_form_arguments}+ "]" | |
; | |
do_as_renaming | |
= | |
| "<-" | |
| "<<-" | |
; | |
mapping_function | |
= | |
| "x" ~ "as" mapping_as:mapping_as | |
| function_form:function_form ["as" mapping_as:mapping_as] | |
; | |
mapping_as | |
= | |
| sed_replace:sedlike_regex ~ | |
| format_column:format_column | |
; | |
mapping_form_arguments | |
= | |
| column_range:column_range | |
| column_index:column_index | |
| regex_columns:regex_of_regex | |
; | |
glob_selector_allowed_arguments | |
= [lvar:lvar_binding] column_name:fq_column | |
; | |
order_by_allowed_arguments | |
= | |
| [ direction:'+' | direction:'-'] column_name:fq_column | |
| [ direction:'+' | direction:'-'] column_index:column_index | |
; | |
rename_selector_allowed_arguments | |
= | |
| column_name:fq_column "as" column_rename:column_rename | |
| column_index:column_index "as" column_rename:column_rename | |
; | |
distinct_allowed_arguments | |
= | |
| column_name:fq_column | |
| column_index:column_index | |
; | |
having_allowed_arguments | |
= | |
scalar_predicate_expression:scalar_predicate_expression | |
; | |
### | |
aggregate_functions | |
= | |
dimension_embedder:dimension_embedder | |
; | |
group_by_columns | |
= | |
| dimension_projector:dimension_projector | |
| dimension_eraser:dimension_eraser | |
| "[" ",".{grouping_set:group_by_columns} "]" | |
; | |
function_form | |
= | |
| cast_form:"cast:" "(" function_args:function_args "as" type:/[A-Za-z ]+/ ")" | |
| function_name:functor ":" [ function_projection:function_projection] "(" function_args:function_args ")" | |
| predicate_function_limited_name:functor "::" [ function_projection:function_projection] "(" correlated_goal:goal ")" | |
; | |
function_projection | |
= | |
| "[" ",".{ @+:column_name} "]" | |
| @+:column_name | |
; | |
function_args | |
= | |
@+:",".{ "*" | scalar_predicate_expression | function_form | numeric | column_name | quoted_value | protected_column_name }* | |
; | |
inline_column | |
= "{" inline:( /(([^}])|(\\}))+/) "}" | |
; | |
format_column | |
= 'f:"' inline:( /(\\\"|[^\"])*/ ) '"' | |
; | |
format_column_as_function | |
= 'f:' [function_projection:column_name] '"' inline:( /(\\\"|[^\"])*/ ) '"' | |
; | |
scalar_predicate_expression | |
= | |
| lhs:scalar_predicate_side scalar_comparison:sql_scalar_operator rhs:scalar_predicate_side | |
| parenthesized_scalar_predicate_expression:( "(" scalar_predicate_expression ")" ) | |
# | ( sql_scalar_operator )<{ scalar_predicate_side }+ | |
; | |
table_as_scalar | |
= | |
"scalar{" @:goal "}" | |
; | |
case_statement | |
= | |
| case:case_multiple | |
| case_on:case_on | |
; | |
case_on | |
= "case_on:" [ function_projection:column_name] "(" ~ match_from:case_allowed ")" | |
";".{ ground_term_or_else:(ground_term | else_sigil ) "->" then:case_allowed }+ | |
; | |
case_multiple | |
= ("case:" | "if:") ~ [ function_projection:column_name] | |
";".{ when:when | |
"->" then:case_allowed }+ | |
; | |
when | |
= | |
| "(" scalar_predicate_expression:scalar_predicate_expression ")" | |
| else:( "(" "true" ")" ) | |
; | |
case_allowed | |
= | |
| naked_value:ground_term | |
| table_as_scalar:table_as_scalar | |
| case_statement:case_statement | |
| scalar_predicate_expression:scalar_predicate_expression | |
| function_form:function_form | |
| format_column:format_column | |
| column_name:fq_column | |
| inline_column:inline_column | |
; | |
scalar_predicate_side | |
= | |
| scalar_predicate_expression:scalar_predicate_expression | |
| parenthesized_scalar_predicate_expression:( "(" scalar_predicate_expression ")" ) | |
| ground_term:ground_term | |
| function_form:function_form | |
| column_name:fq_column | |
; | |
lvar_binding | |
= | |
| naked_at:at | |
| lvar_name:column_name at | |
; | |
column_rename | |
= | |
| column_name:column_name | |
| protected_column_name:protected_column_name | |
; | |
relation_bookmark | |
= | |
at @:datalog_like_named_predicate | |
; | |
ground_term | |
= | |
| text:quoted_value | |
| number:numeric | |
; | |
numeric | |
= | |
| real_like | |
| int_like | |
; | |
real_like | |
= | |
| /-?[0-9]+\.[0-9]+/ | |
| /-?[0-9]*\.[0-9]+/ | |
; | |
int_like | |
= | |
/-?[0-9]+/ | |
; | |
quoted_value | |
= | |
| "'" quoted_value:{ /(\\\'|[^\'])*/ }* "'" | |
| '"' quoted_value:{ /(\\\"|[^\"])*/ }* '"' | |
; | |
protected_column_name | |
= '`' protected_value:{ /(\\`|[^`])*/ }* '`' | |
; | |
############################################################################ | |
# | |
# | |
# Terminals | |
# | |
# | |
end_marker = period; | |
else_sigil = "_"; | |
at = "@"; | |
pipe = "|>"; | |
glob = "*"; | |
double_glob = "**"; | |
join = ","; | |
left_outer_join = ">," !"<"; | |
right_outer_join = ",<"; | |
full_outer_join = ">,<"; | |
exists = ",+"; | |
not_exists = ",\+"; | |
period = "."; | |
union = ">;"; | |
union_all = | |
| "union" "all" | |
| ">;<" ; | |
excessive_union = ";"; | |
intersect = "^"; | |
except_minus = "-"; | |
flip_except_minus = "-~"; | |
comma = ","; | |
sem_consq = "|="; | |
column_name = !"_" /[A-Za-z_]+[A-Za-z-1-9_]*/; | |
full_sigil = "_"; | |
minus_sign = "-"; | |
pound = "#"; | |
schema = /[A-Za-z]+[A-Za-z0-9]*/; | |
implication = ":-"; | |
regex_of_regex = regex:/\/.+\// [case_insensitive:/i/] [global:/g/] [case_insensitive:/i/] [global:/g/]; | |
sedlike_regex = /s\// sed1:/[^\/]+/ /\// sed2:/[^\/]+/ /\// [global:/g/]; | |
############################################################################ | |
# | |
# | |
# SQL Operators | |
# | |
# | |
sql_scalar_operator | |
= | |
| sso_concat | |
| sso_mulitply | |
| sso_divide | |
| sso_modulus | |
| sso_plus | |
| sso_minus | |
| sso_shiftleft | |
| sso_shiftright | |
| sso_bitand | |
| sso_bitor | |
| sso_lessthan | |
| sso_lessthanequals | |
| sso_greaterthan | |
| sso_greaterthanequals | |
| sso_double_equals | |
| sso_equals | |
| sso_not_equals_bang | |
| sso_not_equals_bracket | |
| sso_is | |
| sso_isnot | |
| sso_like | |
| sso_glob | |
| sso_match | |
| sso_and | |
| sso_or | |
; | |
sso_concat = "||"; | |
sso_mulitply = "*"; | |
sso_divide = "/"; | |
sso_modulus = "%"; | |
sso_plus = "+" !"["; | |
sso_minus = "-" !"["; | |
sso_shiftleft = "<<"; | |
sso_shiftright = ">>"; | |
sso_bitand = "&"; | |
sso_bitor = "|"; | |
sso_lessthan = "<" !("=" | "<"); | |
sso_lessthanequals = "<="; | |
sso_greaterthan = ">" !("=" | "<" | ","); | |
sso_greaterthanequals = ">="; | |
sso_equals = "=" !"="; | |
sso_double_equals = "=="; | |
sso_not_equals_bang = "!="; | |
sso_not_equals_bracket = "<>"; | |
sso_is = "IS" !"NOT"; | |
sso_isnot = "IS" "NOT"; | |
sso_like = "LIKE"; | |
sso_glob = "GLOB"; | |
sso_match = "MATCH"; | |
sso_and = "AND"; | |
sso_or = "OR"; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment