added documentation to lexer and grammar files

This commit is contained in:
Pedro 2014-10-22 15:43:27 +02:00
parent b92bbd9157
commit d2b5e10945
2 changed files with 133 additions and 51 deletions

View File

@ -1,23 +1,43 @@
%{ %{
/**
/* * bison_parser.y
* parser.y file * defines bison_parser.h
* To generate the parser run: "bison parser.y" * outputs bison_parser.c
*
* Grammar File Spec: http://dinosaur.compilertools.net/bison/bison_6.html
*
*/ */
/*********************************
** Section 1: C Declarations
*********************************/
#include "Statement.h" #include "Statement.h"
#include "List.h" #include "List.h"
#include "bison_parser.h" #include "bison_parser.h"
#include "flex_lexer.h" #include "flex_lexer.h"
#include <iostream> #include <stdio.h>
int yyerror(Statement **expression, yyscan_t scanner, const char *msg) { int yyerror(Statement **expression, yyscan_t scanner, const char *msg) {
// Add error handling routine as needed fprintf(stderr, "[Error] SQL Parser: %s\n", msg);
return 0;
} }
%} %}
/*********************************
** Section 2: Bison Parser Declarations
*********************************/
// Define the names of the created files
%output "bison_parser.c"
%defines "bison_parser.h"
// Tell bison to create a reentrant parser
%define api.pure full
// Specify code that is included in the generated .h and .c files
%code requires { %code requires {
#ifndef YYtypeDEF_YY_SCANNER_T #ifndef YYtypeDEF_YY_SCANNER_T
@ -27,14 +47,18 @@ typedef void* yyscan_t;
} }
%output "bison_parser.c" // Define additional parameters for yylex (http://www.gnu.org/software/bison/manual/html_node/Pure-Calling.html)
%defines "bison_parser.h"
%define api.pure
%lex-param { yyscan_t scanner } %lex-param { yyscan_t scanner }
// Define additional parameters for yyparse
%parse-param { Statement **statement } %parse-param { Statement **statement }
%parse-param { yyscan_t scanner } %parse-param { yyscan_t scanner }
/*********************************
** Define all data-types (http://www.gnu.org/software/bison/manual/html_node/Union-Decl.html)
*********************************/
%union { %union {
float number; float number;
char* sval; char* sval;
@ -48,39 +72,58 @@ typedef void* yyscan_t;
List<Expr*>* explist; List<Expr*>* explist;
} }
%token SELECT FROM GROUP BY WHERE NOT AND OR
/*********************************
** Token Definition
*********************************/
%token SELECT FROM GROUP BY WHERE NOT AND OR
%token <sval> NAME STRING COMPARISON %token <sval> NAME STRING COMPARISON
%token <number> INTNUM %token <number> INTNUM
/*********************************
** Non-Terminal types (http://www.gnu.org/software/bison/manual/html_node/Type-Decl.html)
*********************************/
%type <statement> statement %type <statement> statement
%type <select_statement> select_statement %type <select_statement> select_statement
%type <sval> table_name %type <sval> table_name
%type <table> from_clause table_exp %type <table> from_clause table_exp
%type <expr> expr column_name scalar_exp literal %type <expr> expr column_name scalar_exp literal
%type <expr> comparison_predicate predicate search_condition where_clause %type <expr> comparison_predicate predicate search_condition where_clause
%type <slist> table_ref_commalist %type <slist> table_ref_commalist
%type <explist> expr_list group_clause %type <explist> expr_list group_clause
%% %%
/*********************************
** Section 3: Grammar Definition
*********************************/
// Defines our general input.
// TODO: Support list of statements
input: input:
statement opt_semicolon { *statement = $1; } statement opt_semicolon { *statement = $1; }
; ;
// All types of statements
// Atm: only select statements (future: insert, delete, etc...)
statement: statement:
select_statement { $$ = $1; } select_statement { $$ = $1; }
| /* empty */ { $$ = NULL; } | /* empty */ { $$ = NULL; }
; ;
////// TODO: /******************************
// join ** Select Statements
// limit ******************************/
// order by
// TODO: join
// TODO: limit
// TODO: order by
select_statement: select_statement:
SELECT expr_list from_clause where_clause group_clause SELECT expr_list from_clause where_clause group_clause
{ {
@ -99,18 +142,20 @@ from_clause:
FROM table_exp { $$ = $2; } FROM table_exp { $$ = $2; }
; ;
where_clause: where_clause:
WHERE search_condition { $$ = $2; } WHERE search_condition { $$ = $2; }
| /* empty */ { $$ = NULL; } | /* empty */ { $$ = NULL; }
; ;
// TODO: having
group_clause: group_clause:
GROUP BY expr_list { $$ = $3; } GROUP BY expr_list { $$ = $3; }
| /* empty */ { $$ = NULL; } | /* empty */ { $$ = NULL; }
; ;
// TODO: comma_list with mixed table names and select statements
table_exp: table_exp:
table_ref_commalist { table_ref_commalist {
TableRef* t = new TableRef(eTableName); TableRef* t = new TableRef(eTableName);
@ -125,41 +170,34 @@ table_exp:
; ;
// TODO: multiple predicates
search_condition: search_condition:
predicate predicate
; ;
predicate: predicate:
comparison_predicate comparison_predicate
; ;
comparison_predicate: comparison_predicate:
scalar_exp COMPARISON scalar_exp { $$ = makePredicate($1, $2, $3); } scalar_exp COMPARISON scalar_exp { $$ = makePredicate($1, $2, $3); }
; ;
// TODO: Expression can also be scalar_exp
expr: expr:
column_name column_name
| NAME '(' expr ')' { $$ = makeFunctionRef($1, $3); } | NAME '(' expr ')' { $$ = makeFunctionRef($1, $3); }
; ;
// TODO: Scalar expressions can also be arithmetic
/* Lists */ scalar_exp:
expr_list: column_name
expr { $$ = new List<Expr*>($1); } | literal
| 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: column_name:
NAME { $$ = makeColumnRef($1); } NAME { $$ = makeColumnRef($1); }
; ;
@ -174,13 +212,33 @@ literal:
| INTNUM { $$ = makeFloatLiteral($1); } | INTNUM { $$ = makeFloatLiteral($1); }
; ;
scalar_exp:
column_name
| literal
;
opt_semicolon: opt_semicolon:
';' ';'
| /* empty */ | /* empty */
; ;
/******************************
** Lists
******************************/
expr_list:
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; }
;
%% %%
/*********************************
** Section 4: Additional C code
*********************************/
/* empty */

View File

@ -1,32 +1,50 @@
%{ /**
* lexer
/* *
* lexer.l file *
* To generate the lexical analyzer run: "flex lexer.l"
*/ */
/***************************
** Section 1: Definitions
***************************/
%{
#include "Statement.h" #include "Statement.h"
#include "List.h" #include "List.h"
#include "bison_parser.h" #include "bison_parser.h"
#include <stdio.h> #include <stdio.h>
#include <iostream>
using namespace std;
#define TOK(name) { return name; } #define TOK(name) { return name; }
%} %}
/***************************
** Section 2: Rules
***************************/
/* Define the output files */
%option header-file="flex_lexer.h"
%option outfile="flex_lexer.c"
%option outfile="flex_lexer.c" header-file="flex_lexer.h" /* Make reentrant */
%option warn nodefault %option reentrant bison-bridge
%option reentrant noyywrap never-interactive nounistd
%option bison-bridge /* performance tweeks */
%option never-interactive batch
/* other flags */
%option noyywrap warn
%option case-insensitive %option case-insensitive
/* %option nodefault */
/***************************
** Section 3: Rules
***************************/
%% %%
[ \t\n]+ ; [ \t\n]+ /* skip whitespace */;
SELECT TOK(SELECT) SELECT TOK(SELECT)
FROM TOK(FROM) FROM TOK(FROM)
@ -69,8 +87,14 @@ OR TOK(OR)
return STRING; return STRING;
} }
%% %%
/***************************
** Section 3: User code
***************************/
int yyerror(const char *msg) { int yyerror(const char *msg) {
fprintf(stderr,"Error:%s\n",msg); return 0; fprintf(stderr, "[Error] SQL Lexer: %s\n",msg); return 0;
} }