diff --git a/parser/parser.mly b/parser/parser.mly index d9eca54..91ba563 100644 --- a/parser/parser.mly +++ b/parser/parser.mly @@ -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 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 INTEGER -%token FLOAT +%token 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 {} + | 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,7 +179,8 @@ parenthesized_value_expression: | LEFT_PAREN value_expression RIGHT_PAREN { $2 } nonparenthesized_value_expression_primary: - | unsigned_value_specification { $1 } + (* 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) } (********************************)