-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsql_parser.y
More file actions
118 lines (107 loc) · 2.37 KB
/
Copy pathsql_parser.y
File metadata and controls
118 lines (107 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
%define api.pure
%parse-param {ParserResult* result}
%locations
%no-lines
%verbose
%{
#include "sql_node.h"
#include <stdarg.h>
#define YYDEBUG 1
%}
// 指定yyval的类型
%union
{
struct ParserNode* node;
}
%{
#include "sql_parser.lex.h"
#define YYLEX_PARAM result->scanner
%}
%token CREATE TABLE FLOAT VARCHAR INT END_P
%token <node> NAME
%type <node> create_table_stmt relation_factor table_element_list column_definition data_type
%%
create_table_stmt:
CREATE TABLE relation_factor '(' table_element_list ')' END_P
{
ParserNode* table = (ParserNode*) malloc(sizeof(ParserNode));
table->num = 2;
table->item = T_CREATE_TABLE;
table->child = (ParserNode**) malloc(sizeof(ParserNode) * 2);
table->child[0] = $3;
table->child[1] = $5;
result->node = table;
YYACCEPT;
}
;
relation_factor:
NAME
{ $$ = $1; }
;
table_element_list:
column_definition
{
$$ = $1;
}
| table_element_list ',' column_definition
{
ParserNode* element = (ParserNode*)malloc(sizeof(ParserNode));
element->num = 2;
element->item = TABLE_ELEMENT;
element->child = (ParserNode**) malloc(sizeof(ParserNode) * 2);
element->child[0] = $1;
element->child[1] = $3;
$$ = element;
}
;
column_definition:
NAME data_type
{
ParserNode* column = (ParserNode*)malloc(sizeof(ParserNode));
column->num = 2;
column->item = TABLE_COLUMN;
column->child = (ParserNode**) malloc(sizeof(ParserNode) * 2);
column->child[0] = $1;
column->child[1] = $2;
$$ = column;
}
;
data_type:
INT
{
ParserNode* node = (ParserNode*)malloc(sizeof(ParserNode));
node->item = T_TYPE_INT;
$$ = node;
}
| VARCHAR
{
ParserNode* node = (ParserNode*)malloc(sizeof(ParserNode));
node->item = T_TYPE_VARCHAR;
$$ = node;
}
| FLOAT
{
ParserNode* node = (ParserNode*)malloc(sizeof(ParserNode));
node->item = T_TYPE_FLOAT;
$$ = node;
}
;
%%
void yyerror(YYLTYPE* yyloc, ParserResult* p, char* s, ...)
{
puts("error");
va_list ap;
char buff[1000];
va_start(ap, s);
vsnprintf(buff, 1000, s, ap);
printf("%s\n", buff);
}
/** 语法解析调用入口*/
void parse_sql(ParserResult* p, char* buff, int len)
{
yylex_init_extra(p, &(p->scanner));
YY_BUFFER_STATE bp = yy_scan_bytes(buff, len, p->scanner);
yy_switch_to_buffer(bp, p->scanner);
yyparse(p);
yy_delete_buffer(bp, p->scanner);
}