completing grammar
This commit is contained in:
parent
a8efef907a
commit
34ccc51b79
@ -24,6 +24,9 @@ rule read_token = parse
|
|||||||
| "ON" { ON }
|
| "ON" { ON }
|
||||||
| "WHERE" { WHERE }
|
| "WHERE" { WHERE }
|
||||||
| "HAVING" { HAVING }
|
| "HAVING" { HAVING }
|
||||||
|
| "BETWEEN" { BETWEEN }
|
||||||
|
| "IN" { IN }
|
||||||
|
| "LIKE" { LIKE }
|
||||||
| "GROUP" { GROUP }
|
| "GROUP" { GROUP }
|
||||||
| "BY" { BY }
|
| "BY" { BY }
|
||||||
| "*" { ASTERISK }
|
| "*" { ASTERISK }
|
||||||
@ -32,6 +35,7 @@ rule read_token = parse
|
|||||||
| "(" { LEFT_PAREN }
|
| "(" { LEFT_PAREN }
|
||||||
| ")" { RIGHT_PAREN }
|
| ")" { RIGHT_PAREN }
|
||||||
| "," { COMMA }
|
| "," { COMMA }
|
||||||
|
| "|" { PIPE }
|
||||||
| whitespace { read_token lexbuf }
|
| whitespace { read_token lexbuf }
|
||||||
| alpha alphanumeric* as ident { IDENT ident }
|
| alpha alphanumeric* as ident { IDENT ident }
|
||||||
| eof { EOF }
|
| eof { EOF }
|
||||||
|
42
lib/ast.ml
42
lib/ast.ml
@ -26,6 +26,7 @@ and predicate =
|
|||||||
| NotBetween of string * string
|
| NotBetween of string * string
|
||||||
| In of string list
|
| In of string list
|
||||||
| NotIn of string list
|
| NotIn of string list
|
||||||
|
| Like of string
|
||||||
and operator =
|
and operator =
|
||||||
| Equals
|
| Equals
|
||||||
| NotEquals
|
| NotEquals
|
||||||
@ -37,3 +38,44 @@ and filter =
|
|||||||
| Filter of string
|
| Filter of string
|
||||||
and search_condition =
|
and search_condition =
|
||||||
| Search of string
|
| Search of string
|
||||||
|
|
||||||
|
|
||||||
|
let rec pp_query ast =
|
||||||
|
match ast with
|
||||||
|
| Query(s) -> pp_select s
|
||||||
|
|
||||||
|
and pp_select s =
|
||||||
|
match s with
|
||||||
|
| Select(cols, _) -> pp_columns cols
|
||||||
|
|
||||||
|
and pp_columns cols =
|
||||||
|
match cols with
|
||||||
|
| [] -> ""
|
||||||
|
| [col] -> pp_column col
|
||||||
|
| col::l -> pp_column col ^ ";" ^ pp_columns l
|
||||||
|
|
||||||
|
and pp_column col =
|
||||||
|
match col with
|
||||||
|
| Column(name) -> name
|
||||||
|
| Asterisk -> "*"
|
||||||
|
|
||||||
|
and pp_tables tables =
|
||||||
|
match tables with
|
||||||
|
| [] -> ""
|
||||||
|
| [table] -> pp_table table
|
||||||
|
| table::l -> pp_table table ^ ";" ^ pp_tables l
|
||||||
|
|
||||||
|
and pp_table table =
|
||||||
|
match table with
|
||||||
|
| Table(table) -> table
|
||||||
|
| Join(t1, j, t2, _) -> pp_table t1 ^ pp_join_type j ^ pp_table t2
|
||||||
|
|
||||||
|
and pp_join_type j =
|
||||||
|
match j with
|
||||||
|
| Inner -> "inner"
|
||||||
|
| Left -> "left"
|
||||||
|
| Right -> "right"
|
||||||
|
| Full -> "full"
|
||||||
|
| Cross -> "cross"
|
||||||
|
| Union -> "union"
|
||||||
|
| Natural -> "natural"
|
||||||
|
@ -4,14 +4,14 @@ open Ast
|
|||||||
%}
|
%}
|
||||||
|
|
||||||
%token CREATE TABLE
|
%token CREATE TABLE
|
||||||
%token SELECT ALL DISTINCT FROM WHERE HAVING BETWEEN IN
|
%token SELECT ALL DISTINCT FROM WHERE HAVING BETWEEN IN LIKE
|
||||||
%token LEFT RIGHT FULL INNER OUTER
|
%token LEFT RIGHT FULL INNER OUTER
|
||||||
%token CROSS NATURAL UNION JOIN
|
%token CROSS NATURAL UNION JOIN
|
||||||
%token GREATER_THAN_OPERATOR LESS_THAN_OPERATOR EQUALS_OPERATOR
|
%token GREATER_THAN_OPERATOR LESS_THAN_OPERATOR EQUALS_OPERATOR
|
||||||
%token MAX MIN SUM COUNT AVG
|
%token MAX MIN SUM COUNT AVG
|
||||||
%token ASYMMETRIC SYMMETRIC
|
%token ASYMMETRIC SYMMETRIC
|
||||||
%token <string> IDENT
|
%token <string> IDENT
|
||||||
%token COMMA DOT
|
%token COMMA DOT PIPE
|
||||||
%token LEFT_PAREN RIGHT_PAREN
|
%token LEFT_PAREN RIGHT_PAREN
|
||||||
%token ASTERISK
|
%token ASTERISK
|
||||||
%token AS ON GROUP BY FILTER
|
%token AS ON GROUP BY FILTER
|
||||||
@ -165,7 +165,7 @@ predicate :
|
|||||||
| comparison_predicate { $1 }
|
| comparison_predicate { $1 }
|
||||||
| between_predicate { $1 }
|
| between_predicate { $1 }
|
||||||
| in_predicate { $1 }
|
| in_predicate { $1 }
|
||||||
| like_predicate { $1 }
|
(* | like_predicate { $1 } *)
|
||||||
|
|
||||||
comparison_predicate :
|
comparison_predicate :
|
||||||
| row_value_predicand comparison_predicate_part2 { Condition($1, $2) }
|
| row_value_predicand comparison_predicate_part2 { Condition($1, $2) }
|
||||||
@ -199,6 +199,36 @@ in_value_list:
|
|||||||
| row_value_expression { [$1] }
|
| row_value_expression { [$1] }
|
||||||
| in_value_list COMMA row_value_expression { $3::$1 }
|
| in_value_list COMMA row_value_expression { $3::$1 }
|
||||||
|
|
||||||
|
like_predicate :
|
||||||
|
| character_like_predicate { $1 }
|
||||||
|
|
||||||
|
character_like_predicate :
|
||||||
|
| row_value_predicand character_like_predicate_part2 { }
|
||||||
|
|
||||||
|
character_like_predicate_part2:
|
||||||
|
| LIKE character_pattern {}
|
||||||
|
| NOT LIKE character_pattern {}
|
||||||
|
|
||||||
|
character_pattern :
|
||||||
|
| character_value_expression {}
|
||||||
|
|
||||||
|
character_value_expression:
|
||||||
|
| concatenation {}
|
||||||
|
| character_factor {}
|
||||||
|
|
||||||
|
concatenation:
|
||||||
|
| character_value_expression concatenation_operator character_factor {}
|
||||||
|
|
||||||
|
character_factor :
|
||||||
|
| character_primary {}
|
||||||
|
|
||||||
|
character_primary:
|
||||||
|
| value_expression_primary {}
|
||||||
|
(* | string_value_function {} *)
|
||||||
|
|
||||||
|
concatenation_operator:
|
||||||
|
| PIPE PIPE {}
|
||||||
|
|
||||||
row_value_expression :
|
row_value_expression :
|
||||||
| row_value_special_case { $1 }
|
| row_value_special_case { $1 }
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user