|
@@ -16,7 +16,6 @@ int yydebug=1;
|
|
|
|
|
|
void yyerror(const char* s);
|
|
void yyerror(const char* s);
|
|
|
|
|
|
-char* catstr(char* s1, char* s2);
|
|
|
|
cJSON* jroot;
|
|
cJSON* jroot;
|
|
|
|
|
|
|
|
|
|
@@ -117,37 +116,31 @@ create_table_stmt: CREATE TABLE IDENTIFIER
|
|
cJSON_AddStringToObject(node, "type", "create_table");
|
|
cJSON_AddStringToObject(node, "type", "create_table");
|
|
cJSON_AddStringToObject(node, "table_name", $3);
|
|
cJSON_AddStringToObject(node, "table_name", $3);
|
|
cJSON_AddItemToObject(node, "cols", cJSON_CreateArray());
|
|
cJSON_AddItemToObject(node, "cols", cJSON_CreateArray());
|
|
- $$=node;
|
|
|
|
|
|
+ $$ = node;
|
|
}
|
|
}
|
|
|
|
+;
|
|
|
|
|
|
create_table_stmt: CREATE TABLE IDENTIFIER '(' create_col_list ')' {
|
|
create_table_stmt: CREATE TABLE IDENTIFIER '(' create_col_list ')' {
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON_AddStringToObject(node, "type", "create_table");
|
|
cJSON_AddStringToObject(node, "type", "create_table");
|
|
cJSON_AddStringToObject(node, "table_name", $3);
|
|
cJSON_AddStringToObject(node, "table_name", $3);
|
|
cJSON_AddItemToObject(node, "cols", $5);
|
|
cJSON_AddItemToObject(node, "cols", $5);
|
|
- $$=node;
|
|
|
|
-};
|
|
|
|
|
|
+ $$ = node;
|
|
|
|
+ }
|
|
|
|
+;
|
|
|
|
|
|
create_col_list: create_definition {
|
|
create_col_list: create_definition {
|
|
cJSON* node = cJSON_CreateArray();
|
|
cJSON* node = cJSON_CreateArray();
|
|
cJSON_AddItemToArray(node, $1);
|
|
cJSON_AddItemToArray(node, $1);
|
|
- $$=node;
|
|
|
|
- // printf("得create_definition %s\n", cJSON_Print($1));
|
|
|
|
|
|
+ $$ = node;
|
|
}
|
|
}
|
|
| create_col_list ',' create_definition {
|
|
| create_col_list ',' create_definition {
|
|
- // printf("迭代 create_col_list\n %s", cJSON_Print($1));
|
|
|
|
- // printf("迭代 create_definition\n %s", cJSON_Print($3));
|
|
|
|
-
|
|
|
|
cJSON_AddItemToArray($1, $3);
|
|
cJSON_AddItemToArray($1, $3);
|
|
-
|
|
|
|
- $$=$1;
|
|
|
|
- // printf("迭代\n %s", cJSON_Print($$));
|
|
|
|
|
|
+ $$ = $1;
|
|
}
|
|
}
|
|
- ;
|
|
|
|
|
|
+;
|
|
|
|
|
|
create_definition: IDENTIFIER data_type col_options {
|
|
create_definition: IDENTIFIER data_type col_options {
|
|
- // fprintf(stderr, "得列 %s %s with options %s: %d\n", $1, $2, $3, strlen($3));
|
|
|
|
-
|
|
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON_AddStringToObject(node, "type", "create_column");
|
|
cJSON_AddStringToObject(node, "type", "create_column");
|
|
cJSON_AddStringToObject(node, "column_name", $1);
|
|
cJSON_AddStringToObject(node, "column_name", $1);
|
|
@@ -158,12 +151,15 @@ create_definition: IDENTIFIER data_type col_options {
|
|
cJSON_AddFalseToObject(node, "primary_key");
|
|
cJSON_AddFalseToObject(node, "primary_key");
|
|
}
|
|
}
|
|
$$ = node;
|
|
$$ = node;
|
|
-};
|
|
|
|
|
|
+ }
|
|
|
|
+;
|
|
|
|
+
|
|
col_options: {$$ = "";}
|
|
col_options: {$$ = "";}
|
|
| PRIMARY_KEY {
|
|
| PRIMARY_KEY {
|
|
// printf("得到主键 %s\n", $1);
|
|
// printf("得到主键 %s\n", $1);
|
|
$$ = $1;
|
|
$$ = $1;
|
|
}
|
|
}
|
|
|
|
+;
|
|
|
|
|
|
data_type: INT_T
|
|
data_type: INT_T
|
|
| FLOAT_T
|
|
| FLOAT_T
|
|
@@ -176,24 +172,20 @@ insert_stmt: INSERT INTO IDENTIFIER VALUES '(' insert_list ')' {
|
|
cJSON_AddStringToObject(node, "table_name", $3);
|
|
cJSON_AddStringToObject(node, "table_name", $3);
|
|
cJSON_AddItemToObject(node, "values", $6);
|
|
cJSON_AddItemToObject(node, "values", $6);
|
|
$$=node;
|
|
$$=node;
|
|
-};
|
|
|
|
|
|
+ }
|
|
|
|
+;
|
|
|
|
|
|
insert_list: data_value {
|
|
insert_list: data_value {
|
|
- cJSON* node = cJSON_CreateArray();
|
|
|
|
- cJSON_AddItemToArray(node, $1);
|
|
|
|
- $$=node;
|
|
|
|
- // printf("得create_definition %s\n", cJSON_Print($1));
|
|
|
|
-}
|
|
|
|
|
|
+ cJSON* node = cJSON_CreateArray();
|
|
|
|
+ cJSON_AddItemToArray(node, $1);
|
|
|
|
+ $$=node;
|
|
|
|
+ }
|
|
| insert_list ',' data_value {
|
|
| insert_list ',' data_value {
|
|
- // printf("迭代 create_col_list\n %s", cJSON_Print($1));
|
|
|
|
- // printf("迭代 create_definition\n %s", cJSON_Print($3));
|
|
|
|
-
|
|
|
|
cJSON_AddItemToArray($1, $3);
|
|
cJSON_AddItemToArray($1, $3);
|
|
-
|
|
|
|
$$=$1;
|
|
$$=$1;
|
|
- // printf("迭代\n %s", cJSON_Print($$));
|
|
|
|
}
|
|
}
|
|
;
|
|
;
|
|
|
|
+
|
|
data_value: INT_V {SIMPLE_TYPE_VALUE_OBJECT($$, int, Number, $1);}
|
|
data_value: INT_V {SIMPLE_TYPE_VALUE_OBJECT($$, int, Number, $1);}
|
|
| FLOAT_V {SIMPLE_TYPE_VALUE_OBJECT($$, float, Number, $1);}
|
|
| FLOAT_V {SIMPLE_TYPE_VALUE_OBJECT($$, float, Number, $1);}
|
|
| STRING_V {SIMPLE_TYPE_VALUE_OBJECT($$, string, String, $1);}
|
|
| STRING_V {SIMPLE_TYPE_VALUE_OBJECT($$, string, String, $1);}
|
|
@@ -206,7 +198,9 @@ update_stmt: UPDATE IDENTIFIER SET update_list WHERE where_expr {
|
|
cJSON_AddItemToObject(node, "set", $4);
|
|
cJSON_AddItemToObject(node, "set", $4);
|
|
cJSON_AddItemToObject(node, "where", $6);
|
|
cJSON_AddItemToObject(node, "where", $6);
|
|
$$=node;
|
|
$$=node;
|
|
-};
|
|
|
|
|
|
+ }
|
|
|
|
+;
|
|
|
|
+
|
|
update_list: single_assign_item {
|
|
update_list: single_assign_item {
|
|
cJSON* node = cJSON_CreateArray();
|
|
cJSON* node = cJSON_CreateArray();
|
|
cJSON_AddItemToArray(node, $1);
|
|
cJSON_AddItemToArray(node, $1);
|
|
@@ -227,7 +221,6 @@ single_assign_item: identifier '=' identifier_or_const_value {
|
|
}
|
|
}
|
|
;
|
|
;
|
|
|
|
|
|
-
|
|
|
|
single_expr: identifier {$$=$1;}
|
|
single_expr: identifier {$$=$1;}
|
|
| IDENTIFIER '.' IDENTIFIER {
|
|
| IDENTIFIER '.' IDENTIFIER {
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON* node = cJSON_CreateObject();
|
|
@@ -239,11 +232,13 @@ single_expr: identifier {$$=$1;}
|
|
| data_value {$$=$1;}
|
|
| data_value {$$=$1;}
|
|
// | '(' single_expr ')' {$$=$2;}
|
|
// | '(' single_expr ')' {$$=$2;}
|
|
;
|
|
;
|
|
|
|
+
|
|
where_expr: logical_expr {
|
|
where_expr: logical_expr {
|
|
MEET_JSON(logical_expr from where_expr, $1);
|
|
MEET_JSON(logical_expr from where_expr, $1);
|
|
$$=$1;
|
|
$$=$1;
|
|
}
|
|
}
|
|
;
|
|
;
|
|
|
|
+
|
|
op_where_expr: {$$=cJSON_CreateObject();}
|
|
op_where_expr: {$$=cJSON_CreateObject();}
|
|
| WHERE where_expr {$$=$2;}
|
|
| WHERE where_expr {$$=$2;}
|
|
;
|
|
;
|
|
@@ -253,14 +248,13 @@ compare_expr: compare_expr bin_cmp_op compare_expr {
|
|
SIMPLE_OP_NODE($$, $2, $1, $3);}
|
|
SIMPLE_OP_NODE($$, $2, $1, $3);}
|
|
| single_expr {MEET_JSON(single_expr from compare_expr, $1); $$=$1;}
|
|
| single_expr {MEET_JSON(single_expr from compare_expr, $1); $$=$1;}
|
|
| '(' where_expr ')' {MEET(括号where_expr from compare_expr); $$=$2;}
|
|
| '(' where_expr ')' {MEET(括号where_expr from compare_expr); $$=$2;}
|
|
-
|
|
|
|
;
|
|
;
|
|
-negative_expr: NOT negative_expr {
|
|
|
|
- fprintf(stderr, "negative_expr\n");
|
|
|
|
- SIMPLE_OP_NODE_ONLY_LEFT($$, "非", $2);}
|
|
|
|
|
|
+
|
|
|
|
+negative_expr: NOT negative_expr {SIMPLE_OP_NODE_ONLY_LEFT($$, "非", $2);}
|
|
| compare_expr {MEET_JSON(compare_expr from negative_expr, $1) $$=$1;}
|
|
| compare_expr {MEET_JSON(compare_expr from negative_expr, $1) $$=$1;}
|
|
| '(' negative_expr ')' {MEET_JSON(negative_expr from negative_expr, $2) $$=$2;}
|
|
| '(' negative_expr ')' {MEET_JSON(negative_expr from negative_expr, $2) $$=$2;}
|
|
;
|
|
;
|
|
|
|
+
|
|
contains_expr: identifier bin_contains_op '(' select_stmt ')' {
|
|
contains_expr: identifier bin_contains_op '(' select_stmt ')' {
|
|
MEET_JSON(logical_expr bin_contains_op select_stmt, $2);
|
|
MEET_JSON(logical_expr bin_contains_op select_stmt, $2);
|
|
SIMPLE_OP_NODE($$, $2, $1, $4)
|
|
SIMPLE_OP_NODE($$, $2, $1, $4)
|
|
@@ -274,11 +268,11 @@ contains_expr: identifier bin_contains_op '(' select_stmt ')' {
|
|
|
|
|
|
logical_expr: logical_expr bin_logical_op contains_expr {
|
|
logical_expr: logical_expr bin_logical_op contains_expr {
|
|
fprintf(stderr, "logical_expr %s\n", $2);
|
|
fprintf(stderr, "logical_expr %s\n", $2);
|
|
- SIMPLE_OP_NODE($$, $2, $1, $3);}
|
|
|
|
|
|
+ SIMPLE_OP_NODE($$, $2, $1, $3);
|
|
|
|
+ }
|
|
| contains_expr {MEET_JSON(contains_expr from logical_expr, $1); $$=$1;}
|
|
| contains_expr {MEET_JSON(contains_expr from logical_expr, $1); $$=$1;}
|
|
| single_expr {MEET_JSON(single_expr from logical_expr, $1) $$=$1;}
|
|
| single_expr {MEET_JSON(single_expr from logical_expr, $1) $$=$1;}
|
|
| negative_expr {MEET_JSON(negative_expr from logical_expr, $1); $$=$1;}
|
|
| negative_expr {MEET_JSON(negative_expr from logical_expr, $1); $$=$1;}
|
|
-
|
|
|
|
;
|
|
;
|
|
|
|
|
|
|
|
|
|
@@ -309,9 +303,9 @@ identifier: IDENTIFIER {
|
|
}
|
|
}
|
|
;
|
|
;
|
|
|
|
|
|
-identifier_or_const_value: identifier {$$=$1;}
|
|
|
|
- | data_value {$$=$1;}
|
|
|
|
|
|
+identifier_or_const_value: identifier {$$=$1;} | data_value {$$=$1;}
|
|
;
|
|
;
|
|
|
|
+
|
|
data_value_list: data_value {
|
|
data_value_list: data_value {
|
|
cJSON* node = cJSON_CreateArray();
|
|
cJSON* node = cJSON_CreateArray();
|
|
cJSON_AddItemToArray(node, $1);
|
|
cJSON_AddItemToArray(node, $1);
|
|
@@ -322,9 +316,11 @@ data_value_list: data_value {
|
|
$$=$1;
|
|
$$=$1;
|
|
}
|
|
}
|
|
;
|
|
;
|
|
|
|
+
|
|
identifier_or_const_value_or_const_value_list: identifier_or_const_value{$$=$1;}
|
|
identifier_or_const_value_or_const_value_list: identifier_or_const_value{$$=$1;}
|
|
| data_value_list {$$=$1;}
|
|
| data_value_list {$$=$1;}
|
|
;
|
|
;
|
|
|
|
+
|
|
where_condition_item: identifier_or_const_value bin_cmp_op identifier_or_const_value {
|
|
where_condition_item: identifier_or_const_value bin_cmp_op identifier_or_const_value {
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON_AddStringToObject(node, "type", $2);
|
|
cJSON_AddStringToObject(node, "type", $2);
|
|
@@ -341,7 +337,6 @@ where_condition_item: identifier_or_const_value bin_cmp_op identifier_or_const_v
|
|
}
|
|
}
|
|
;
|
|
;
|
|
|
|
|
|
-
|
|
|
|
bin_cmp_op: '=' {$$ = "相等";}
|
|
bin_cmp_op: '=' {$$ = "相等";}
|
|
| '>' {$$ = "大于";}
|
|
| '>' {$$ = "大于";}
|
|
| '<' {$$ = "小于";}
|
|
| '<' {$$ = "小于";}
|
|
@@ -359,13 +354,15 @@ bin_logical_op: AND {MEET(and from bin_log) $$ = "且";}
|
|
bin_contains_op: IN {$$ = "包含于";}
|
|
bin_contains_op: IN {$$ = "包含于";}
|
|
| NOT IN {$$ = "不包含于";}
|
|
| NOT IN {$$ = "不包含于";}
|
|
;
|
|
;
|
|
|
|
+
|
|
delete_stmt: DELETE FROM IDENTIFIER op_where_expr {
|
|
delete_stmt: DELETE FROM IDENTIFIER op_where_expr {
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON_AddStringToObject(node, "type", "delete");
|
|
cJSON_AddStringToObject(node, "type", "delete");
|
|
cJSON_AddStringToObject(node, "table_name", $3);
|
|
cJSON_AddStringToObject(node, "table_name", $3);
|
|
cJSON_AddItemToObject(node, "where", $4);
|
|
cJSON_AddItemToObject(node, "where", $4);
|
|
$$=node;
|
|
$$=node;
|
|
-};
|
|
|
|
|
|
+ }
|
|
|
|
+;
|
|
|
|
|
|
select_stmt: SELECT select_items FROM IDENTIFIER op_where_expr {
|
|
select_stmt: SELECT select_items FROM IDENTIFIER op_where_expr {
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON* node = cJSON_CreateObject();
|
|
@@ -374,7 +371,7 @@ select_stmt: SELECT select_items FROM IDENTIFIER op_where_expr {
|
|
cJSON_AddStringToObject(node, "table_name", $4);
|
|
cJSON_AddStringToObject(node, "table_name", $4);
|
|
cJSON_AddItemToObject(node, "where", $5);
|
|
cJSON_AddItemToObject(node, "where", $5);
|
|
$$=node;
|
|
$$=node;
|
|
-}
|
|
|
|
|
|
+ }
|
|
;
|
|
;
|
|
|
|
|
|
select_items: select_item {
|
|
select_items: select_item {
|
|
@@ -387,6 +384,7 @@ select_items: select_item {
|
|
$$=$1;
|
|
$$=$1;
|
|
}
|
|
}
|
|
;
|
|
;
|
|
|
|
+
|
|
select_item: single_expr {
|
|
select_item: single_expr {
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON* node = cJSON_CreateObject();
|
|
cJSON_AddStringToObject(node, "type", "select_column");
|
|
cJSON_AddStringToObject(node, "type", "select_column");
|
|
@@ -406,6 +404,7 @@ select_item: single_expr {
|
|
$$=node;
|
|
$$=node;
|
|
}
|
|
}
|
|
;
|
|
;
|
|
|
|
+
|
|
%%
|
|
%%
|
|
|
|
|
|
int main(int ac, char** av) {
|
|
int main(int ac, char** av) {
|
|
@@ -416,7 +415,6 @@ int main(int ac, char** av) {
|
|
exit(1);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
- // yyin = av[1];
|
|
|
|
yy_scan_string(av[1]);
|
|
yy_scan_string(av[1]);
|
|
int res = yyparse();
|
|
int res = yyparse();
|
|
printf("%s\n", cJSON_Print(jroot));
|
|
printf("%s\n", cJSON_Print(jroot));
|
|
@@ -428,10 +426,3 @@ void yyerror(const char *s) {
|
|
exit(1);
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
-char* catstr(char* s1, char* s2) {
|
|
|
|
- char* s = malloc(strlen(s1)+strlen(s2)+1);
|
|
|
|
- strcpy(s, s1);
|
|
|
|
- strcat(s, s2);
|
|
|
|
- return s;
|
|
|
|
-}
|
|
|
|
-
|
|
|