HyriseSQLParser/src/bison/bison_parser.y

186 lines
2.9 KiB
Plaintext
Raw Normal View History

2014-10-09 01:30:22 +02:00
%{
/*
* parser.y file
* To generate the parser run: "bison parser.y"
*/
#include "Statement.h"
#include "List.h"
2014-10-16 15:35:38 +02:00
#include "bison_parser.h"
#include "flex_lexer.h"
2014-10-09 01:30:22 +02:00
#include <iostream>
int yyerror(Statement **expression, yyscan_t scanner, const char *msg) {
// Add error handling routine as needed
}
%}
%code requires {
#ifndef YY_TYPEDEF_YY_SCANNER_T
#define YY_TYPEDEF_YY_SCANNER_T
typedef void* yyscan_t;
#endif
}
2014-10-16 15:35:38 +02:00
%output "bison_parser.c"
%defines "bison_parser.h"
2014-10-09 01:30:22 +02:00
%define api.pure
%lex-param { yyscan_t scanner }
%parse-param { Statement **statement }
%parse-param { yyscan_t scanner }
%union {
2014-10-09 04:46:25 +02:00
float number;
2014-10-09 01:30:22 +02:00
char* sval;
Statement* statement;
SelectStatement* select_statement;
TableRef* table;
2014-10-09 04:09:47 +02:00
Expr* expr;
2014-10-09 01:30:22 +02:00
List<char*>* slist;
2014-10-09 04:09:47 +02:00
List<Expr*>* explist;
2014-10-09 01:30:22 +02:00
}
%token SELECT FROM GROUP BY WHERE NOT AND OR
2014-10-09 04:46:25 +02:00
%token <sval> NAME STRING COMPARISON
%token <number> INTNUM
2014-10-09 01:30:22 +02:00
%type <statement> statement
%type <select_statement> select_statement
2014-10-09 04:46:25 +02:00
%type <sval> table_name
%type <table> from_clause table_exp
2014-10-09 04:46:25 +02:00
%type <expr> expr column_name scalar_exp literal
%type <expr> comparison_predicate predicate search_condition where_clause
%type <slist> table_ref_commalist
%type <explist> expr_list group_clause
2014-10-09 01:30:22 +02:00
%%
input:
statement opt_semicolon { *statement = $1; }
;
2014-10-09 01:30:22 +02:00
statement:
select_statement { $$ = $1; }
| /* empty */ { $$ = NULL; }
;
2014-10-09 01:30:22 +02:00
2014-10-16 15:31:40 +02:00
////// TODO:
// join
// limit
// order by
2014-10-09 01:30:22 +02:00
select_statement:
SELECT expr_list from_clause where_clause group_clause
2014-10-09 01:30:22 +02:00
{
SelectStatement* s = new SelectStatement();
s->_select_list = $2;
s->_from_table = $3;
2014-10-09 04:46:25 +02:00
s->_where_clause = $4;
s->_group_by = $5;
2014-10-09 01:30:22 +02:00
$$ = s;
}
;
2014-10-09 01:30:22 +02:00
from_clause:
FROM table_exp { $$ = $2; }
;
2014-10-09 01:30:22 +02:00
where_clause:
2014-10-09 04:46:25 +02:00
WHERE search_condition { $$ = $2; }
| /* empty */ { $$ = NULL; }
;
group_clause:
GROUP BY expr_list { $$ = $3; }
| /* empty */ { $$ = NULL; }
;
2014-10-09 01:30:22 +02:00
table_exp:
table_ref_commalist {
2014-10-09 01:30:22 +02:00
TableRef* t = new TableRef(eTableName);
t->_table_names = $1;
2014-10-09 01:30:22 +02:00
$$ = t;
}
| '(' select_statement ')' {
2014-10-09 01:30:22 +02:00
TableRef* t = new TableRef(eTableSelect);
t->_stmt = $2;
2014-10-09 01:30:22 +02:00
$$ = t;
}
;
2014-10-09 01:30:22 +02:00
search_condition:
predicate
;
predicate:
comparison_predicate
;
2014-10-09 01:30:22 +02:00
comparison_predicate:
2014-10-09 04:46:25 +02:00
scalar_exp COMPARISON scalar_exp { $$ = makePredicate($1, $2, $3); }
;
2014-10-09 01:30:22 +02:00
expr:
2014-10-09 04:46:25 +02:00
column_name
| NAME '(' expr ')' { $$ = makeFunctionRef($1, $3); }
;
/* Lists */
expr_list:
2014-10-09 04:09:47 +02:00
expr { $$ = new List<Expr*>($1); }
| expr_list ',' expr { $1->push_back($3); $$ = $1; }
;
// TODO: add table_ref to include names and select queries
table_ref_commalist:
table_name { $$ = new List<char*>($1); }
| table_ref_commalist ',' table_name { $1->push_back($3); $$ = $1; }
;
/* / Lists */
column_name:
2014-10-09 04:46:25 +02:00
NAME { $$ = makeColumnRef($1); }
;
table_name:
NAME
| NAME '.' NAME
;
literal:
2014-10-09 04:46:25 +02:00
STRING { $$ = makeStringLiteral($1); }
| INTNUM { $$ = makeFloatLiteral($1); }
;
scalar_exp:
column_name
| literal
;
opt_semicolon:
';'
| /* empty */
;
2014-10-09 01:30:22 +02:00
%%