adding datetime_value_expression + breaking common_value_expression circle

This commit is contained in:
Simon Petit 2024-12-13 08:30:37 +01:00
parent a7a422abfc
commit 58b13cdd52

View File

@ -11,18 +11,19 @@ open Ast
%token CROSS NATURAL UNION JOIN
%token GREATER_THAN_OPERATOR LESS_THAN_OPERATOR EQUALS_OPERATOR
%token MAX MIN SUM COUNT AVG
%token SUBSTRING
%token ASYMMETRIC SYMMETRIC
%token <string> IDENT
%token COMMA DOT PIPE
%token COMMA PIPE
%token LEFT_PAREN RIGHT_PAREN
%token ASTERISK
%token ASTERISK SOLIDUS
%token AS ON GROUP BY FILTER
%token OR AND NOT
%token TRUE FALSE UNKNOWN
%token PLUS_SIGN MINUS_SIGN
%token DATE TIME TIMESTAMP
%token <int> INTEGER
%token FLOAT
%token <float> FLOAT
%token UNDERSCORE QUOTE COLON
%token EOF
%start main
@ -36,6 +37,7 @@ main:
| table_definition EOF { $1 }
| drop_schema_statement EOF { $1 }
| drop_table_statement EOF { $1 }
| drop_column_definition EOF { $1 }
(* 5.2 TOKEN / SEPARATOR *)
@ -59,7 +61,7 @@ literal :
| general_literal { $1 }
unsigned_literal:
(* | unsigned_numeric_literal {}*)
(* | unsigned_numeric_literal { $1 }*)
| general_literal { $1 }
general_literal:
@ -77,14 +79,15 @@ signed_numeric_literal:
| unsigned_numeric_literal {}
unsigned_numeric_literal :
| exact_numeric_literal {}
| exact_numeric_literal { $1 }
exact_numeric_literal:
| FLOAT { }
| INTEGER {}
sign:
| PLUS_SIGN {}
| MINUS_SIGN {}
| PLUS_SIGN { Plus }
| MINUS_SIGN { Minus }
unsigned_integer:
| INTEGER { $1 }
@ -92,7 +95,7 @@ unsigned_integer:
datetime_literal:
| date_literal { $1 }
| time_literal { $1 }
(*| timestamp_literal {}*)
| timestamp_literal { $1 }
date_literal:
| DATE date_string { DateLiteral($2) }
@ -100,12 +103,18 @@ date_literal:
time_literal:
| TIME time_string { TimeLiteral($2) }
timestamp_literal:
| TIMESTAMP timestamp_string { TimestampLiteral($2) }
date_string:
| QUOTE unquoted_date_string QUOTE { $2 }
time_string:
| QUOTE unquoted_time_string QUOTE { $2 }
timestamp_string:
| QUOTE unquoted_timestamp_string QUOTE { $2 }
date_value:
| years_value MINUS_SIGN months_value MINUS_SIGN days_value { String.concat "-" [$1;$3;$5] }
@ -118,6 +127,9 @@ unquoted_date_string:
unquoted_time_string:
| time_value { $1 }
unquoted_timestamp_string:
| unquoted_date_string unquoted_time_string { $1 ^ " " ^$2 }
years_value :
| datetime_value { $1 }
@ -154,10 +166,6 @@ schema_name:
(****************************)
character_value_expression:
(* | concatenation {} *)
| character_factor { $1 }
(* 6. SCALAR EXPRESSION *)
@ -171,6 +179,7 @@ parenthesized_value_expression:
| LEFT_PAREN value_expression RIGHT_PAREN { $2 }
nonparenthesized_value_expression_primary:
(* Return StringLiteral, TimeLiteral, DateLiteral, TimestampLiteral *)
| unsigned_value_specification { $1 }
| column_reference { Ref($1) }
| set_function_specification { Ref("function") }
@ -218,29 +227,70 @@ set_function_specification:
value_expression:
| common_value_expression { $1 }
(*| boolean_value_expression { $1 }*)
(* To avoid cycles and therefore reduce/reduce conflicts
instead of having all *_value_expression below,
they are cascaded :
numeric_value_expression -> string_value_expression
-> datetime_value_expression -> reference_value_expression
in the last step of the *_value_expression preceding
instead of value_expression_primary
This way the parser covers all of them every time, and
prevent reduce/reduce conflicts *)
common_value_expression:
(*| numeric_value_expression {}*)
(*| string_value_expression {} *)
| reference_value_expression { $1 }
| numeric_value_expression { $1 }
(* | string_value_expression { $1 } *)
(* | datetime_value_expression { $1 } *)
(* | reference_value_expression { $1 }*)
reference_value_expression:
| value_expression_primary { $1 }
(*************************)
(* 6.26 NUMERIC VALUE EXPRESSION *)
numeric_value_expression:
| term { $1 }
| numeric_value_expression PLUS_SIGN term { Numeric($1, Plus, $3) }
| numeric_value_expression MINUS_SIGN term { Numeric($1, Minus, $3) }
term:
| factor { $1 }
| term ASTERISK factor { Numeric($1, Times, $3) }
| term SOLIDUS factor { Numeric($1, Divide, $3) }
factor:
| numeric_primary { $1 }
| sign numeric_primary { Signed($1, $2) }
numeric_primary:
| string_value_expression { $1 }
(* | value_expression_primary { $1 }*)
(*********************************)
(* 6.28 STRING VALUE EXPRESSION *)
string_value_expression :
| character_value_expression { $1 }
(* | blob_value_expression {} *)
character_value_expression:
(* Return Concatenation of char_expression * expression_primary *)
| concatenation { $1 }
(* Return Char of string *)
| character_factor { $1 }
character_primary:
| value_expression_primary { $1 }
(* | string_value_function {} *)
| datetime_value_expression { $1 }
(* | value_expression_primary { $1 }*)
| string_value_function { $1 }
concatenation:
| character_value_expression concatenation_operator character_factor {}
| character_value_expression concatenation_operator character_factor { Concatenation($1, $3) }
character_factor :
| character_primary { $1 }
@ -250,13 +300,39 @@ character_factor :
(* 6.29 STRING VALUE FUNCTION *)
string_value_function:
| character_value_function {}
| character_value_function { $1 }
character_value_function :
| {}
| character_substring_function { $1 }
character_substring_function :
| SUBSTRING LEFT_PAREN character_value_expression FROM start_position RIGHT_PAREN { Substring($3, $5) }
start_position:
| numeric_value_expression { $1 }
(*************************)
(* 6.30 DATETIME VALUE EXPRESSION *)
datetime_value_expression:
| datetime_term { $1 }
datetime_term :
| datetime_factor { $1 }
datetime_factor:
| datetime_primary { $1 }
datetime_primary:
| reference_value_expression { $1 }
(* | datetime_value_function { $1 }*)
(**********************************)
(* 6.31 DATETIME VALUE FUCTION *)
(*******************************)
(* 6.34 BOOLEAN VALUE EXPRESSION *)
boolean_value_expression:
@ -330,11 +406,11 @@ table_expression:
| from_clause { TableExpression(Some($1), None, None) }
| from_clause where_clause { TableExpression(Some($1), Some($2), None) }
| from_clause where_clause group_by_clause { TableExpression(Some($1), Some($2), Some($3)) }
(* | from_clause where_clause group_by_clause having_clause { Some($1) }
| from_clause group_by_clause { Some($1) }
| from_clause group_by_clause having_clause { Some($1) }
| from_clause having_clause { Some($1) }
*)
| from_clause where_clause group_by_clause having_clause { TableExpression(Some($1), Some($2), Some($3)) }
| from_clause where_clause having_clause { TableExpression(Some($1), Some($2), None) }
| from_clause group_by_clause { TableExpression(Some($1), None, Some($2)) }
| from_clause group_by_clause having_clause { TableExpression(Some($1), None, Some($2)) }
| from_clause having_clause { TableExpression(Some($1), None, None) }
(************************)
@ -484,15 +560,17 @@ select_sublist_element :
| derived_column { $1 }
(* | qualified_asterisk {} *)
(*
qualified_asterisk:
| asterisked_identifier_chain {}
| asterisked_identifier_chain DOT ASTERISK {}
asterisked_identifier_chain:
| asterisked_identifier {}
| asterisked_identifier_chain DOT asterisked_identifier {}
asterisked_identifier :
| IDENT {}
| ASTERISK {}
*)
derived_column:
| value_expression { Column($1, None) }
@ -666,22 +744,23 @@ drop_schema_statement:
(* 11.3 TABLE DEFINITION *)
table_definition :
| CREATE TABLE table_name { CreateTable($3) }
| CREATE TABLE table_name { CreateTable(None, $3) }
| CREATE table_scope TABLE table_name { CreateTable(Some($2), $4) }
table_scope :
| global_or_local TEMPORARY {}
| global_or_local TEMPORARY { $1 }
global_or_local :
| GLOBAL {}
| LOCAL {}
| GLOBAL { Global }
| LOCAL { Local }
(*************************)
(* 11.18 DROP COLUMN DEFINITION *)
drop_column_definition:
| DROP column_name {}
| DROP COLUMN column_name {}
| DROP column_name { DropColumn($2) }
| DROP COLUMN column_name { DropColumn($3) }
(********************************)