diff --git a/parser/parser.mly b/parser/parser.mly index e79cef8..702ee22 100644 --- a/parser/parser.mly +++ b/parser/parser.mly @@ -19,8 +19,11 @@ open Ast %token AS ON GROUP BY FILTER %token OR AND NOT %token TRUE FALSE UNKNOWN -%token PLUS_SIGN MINUS_SIGN INTEGER FLOAT -%token UNDERSCORE QUOTE +%token PLUS_SIGN MINUS_SIGN +%token DATE TIME TIMESTAMP +%token INTEGER +%token FLOAT +%token UNDERSCORE QUOTE COLON %token EOF %start main %type main @@ -48,18 +51,19 @@ greater_than_or_equals_operator: (* 5.3 LITERAL *) literal : - | signed_numeric_literal {} - | general_literal {} + | signed_numeric_literal { $1 } + | general_literal { $1 } unsigned_literal: (* | unsigned_numeric_literal {}*) - | general_literal {} + | general_literal { $1 } general_literal: - | character_string_literal {} + | character_string_literal { $1 } + | datetime_literal { $1 } character_string_literal: - | QUOTE IDENT QUOTE {} + | QUOTE IDENT QUOTE { StringLiteral($2) } introducer: | UNDERSCORE { } @@ -78,12 +82,65 @@ sign: | PLUS_SIGN {} | MINUS_SIGN {} +unsigned_integer: + | INTEGER { $1 } + +datetime_literal: + | date_literal { $1 } + | time_literal { $1 } + (*| timestamp_literal {}*) + +date_literal: + | DATE date_string { DateLiteral($2) } + +time_literal: + | TIME time_string { TimeLiteral($2) } + +date_string: + | QUOTE unquoted_date_string QUOTE { $2 } + +time_string: + | QUOTE unquoted_time_string QUOTE { $2 } + +date_value: + | years_value MINUS_SIGN months_value MINUS_SIGN days_value { String.concat "-" [$1;$3;$5] } + +time_value: + | hours_value COLON minutes_value COLON seconds_value { String.concat ":" [$1;$3;$5] } + +unquoted_date_string: + | date_value { $1 } + +unquoted_time_string: + | time_value { $1 } + +years_value : + | datetime_value { $1 } + +months_value : + | datetime_value { $1 } + +days_value : + | datetime_value { $1 } + +hours_value : + | datetime_value { $1 } + +minutes_value : + | datetime_value { $1 } + +seconds_value: + | datetime_value { $1 } + +datetime_value : + | unsigned_integer { string_of_int $1 } + (***********) (* 5.4 NAMES AND IDENTIFIER *) column_name : - | IDENT {} + | IDENT { $1 } table_name : | IDENT { Table($1) } @@ -110,6 +167,7 @@ parenthesized_value_expression: | LEFT_PAREN value_expression RIGHT_PAREN { $2 } nonparenthesized_value_expression_primary: + | unsigned_value_specification { $1 } | column_reference { Ref($1) } (*| set_function_specification { Ref("function") } *) @@ -118,8 +176,8 @@ nonparenthesized_value_expression_primary: (* 6.4 VALUE SPECIFCATION / TARGET SPECIFICATION *) unsigned_value_specification: - | unsigned_literal {} - | general_value_specification {} + | unsigned_literal { $1 } + (*| general_value_specification {}*) general_value_specification: | {} @@ -155,7 +213,7 @@ set_function_specification: (* 6.25 VALUE EXPRESSION *) value_expression: - | common_value_expression {} + | common_value_expression { $1 } common_value_expression: (*| numeric_value_expression {}*) @@ -170,7 +228,7 @@ reference_value_expression: (* 6.28 STRING VALUE EXPRESSION *) string_value_expression : - | character_value_expression {} + | character_value_expression { $1 } (* | blob_value_expression {} *) character_primary: @@ -264,8 +322,9 @@ row_value_special_case : (* 7.4 TABLE EXPRESSION *) table_expression: - | from_clause { $1 } - | from_clause where_clause { $1 } + | { None } + | from_clause { Some($1) } + | from_clause where_clause { Some($1) } (************************) @@ -395,15 +454,21 @@ query_specification : select_list : | ASTERISK { [Asterisk] } - | select_sublist {$1} + | select_sublist { $1 } +(* select_sublist : | IDENT { [Column($1)] } | select_sublist COMMA IDENT { Column($3)::$1 } +*) + +select_sublist : + | select_sublist_element { [$1] } + | select_sublist COMMA select_sublist_element { $3::$1 } select_sublist_element : - | derived_column {} - | qualified_asterisk {} + | derived_column { $1 } +(* | qualified_asterisk {} *) qualified_asterisk: | asterisked_identifier_chain {} @@ -416,12 +481,12 @@ asterisked_identifier : | IDENT {} derived_column: - | value_expression {} - | value_expression as_clause {} + | value_expression { Column($1, None) } + | value_expression as_clause { Column($1, Some($2)) } as_clause : - | AS column_name {} - | column_name {} + | AS column_name { As($2) } + (*| column_name { As($1) }*) (****************************) @@ -537,31 +602,31 @@ search_condition: (* 10.9 AGGREGATE FUNCTION *) aggregate_function: - | COUNT LEFT_PAREN ASTERISK RIGHT_PAREN { } - | COUNT LEFT_PAREN ASTERISK RIGHT_PAREN filter_clause { } - | general_set_function { } - | general_set_function filter_clause { } + | COUNT LEFT_PAREN ASTERISK RIGHT_PAREN { Count } + | COUNT LEFT_PAREN ASTERISK RIGHT_PAREN filter_clause { Count } + | general_set_function { Aggregate($1) } + | general_set_function filter_clause { Aggregate($1, $2) } general_set_function: - | set_function_type LEFT_PAREN value_expression RIGHT_PAREN { } - | set_function_type LEFT_PAREN set_quantifier value_expression RIGHT_PAREN { } + | set_function_type LEFT_PAREN value_expression RIGHT_PAREN { Function($1, None, $3) } + | set_function_type LEFT_PAREN set_quantifier value_expression RIGHT_PAREN { Function($1, $3, $4) } set_function_type: - | computationnal_operation {} + | computationnal_operation { $1 } set_quantifier : - | ALL {} - | DISTINCT {} + | ALL { All } + | DISTINCT { Distinct } filter_clause : - | FILTER LEFT_PAREN WHERE search_condition RIGHT_PAREN {} + | FILTER LEFT_PAREN WHERE search_condition RIGHT_PAREN { Filter($4) } computationnal_operation: - | AVG {} - | MAX {} - | MIN {} - | SUM {} - | COUNT {} + | AVG { Avg } + | MAX { Max } + | MIN { Min } + | SUM { Sum } + | COUNT { Count } (***************************)