From b11e52bd6ebf6e4b3cd1c9c20a7b80dc92ad1e77 Mon Sep 17 00:00:00 2001 From: Pedro Date: Mon, 27 Oct 2014 13:54:16 +0100 Subject: [PATCH] added int type to lexer --- src/bison/bison_parser.y | 13 ++++++++----- src/bison/flex_lexer.l | 7 +++++-- src/build_and_run_tests.sh | 2 +- src/lib/Expr.cpp | 36 ++++++++++++++++++++++++------------ src/lib/Expr.h | 9 ++++++--- src/lib/sqlhelper.cpp | 10 ++++++---- 6 files changed, 50 insertions(+), 27 deletions(-) diff --git a/src/bison/bison_parser.y b/src/bison/bison_parser.y index c8907b6..91b9716 100644 --- a/src/bison/bison_parser.y +++ b/src/bison/bison_parser.y @@ -59,9 +59,10 @@ typedef void* yyscan_t; ** Define all data-types (http://www.gnu.org/software/bison/manual/html_node/Union-Decl.html) *********************************/ %union { - float number; - uint uintnum; + double fval; + int64_t ival; char* sval; + uint uintnum; Statement* statement; SelectStatement* select_statement; @@ -83,7 +84,8 @@ typedef void* yyscan_t; %token CREATE TABLE DATABASE INDEX %token AS NOT AND OR NULL LIKE %token NAME STRING COMPARISON -%token FLOAT +%token FLOAT +%token INT %token EQUALS NOTEQUALS LESS GREATER LESSEQ GREATEREQ /********************************* @@ -245,8 +247,9 @@ column_name: ; literal: - STRING { $$ = makeStringLiteral($1); } - | FLOAT { $$ = makeFloatLiteral($1); } + STRING { $$ = Expr::makeLiteral($1); } + | FLOAT { $$ = Expr::makeLiteral($1); } + | INT { $$ = Expr::makeLiteral($1); } ; star_expr: diff --git a/src/bison/flex_lexer.l b/src/bison/flex_lexer.l index ecf086e..9e81b06 100644 --- a/src/bison/flex_lexer.l +++ b/src/bison/flex_lexer.l @@ -68,13 +68,16 @@ OR TOKEN(OR) [-+*/(),.;] { return yytext[0]; } -[0-9]+ | [0-9]+"."[0-9]* | "."[0-9]* { - yylval->number = atof(yytext); + yylval->fval = atof(yytext); return SQL_FLOAT; } +[0-9]+ { + yylval->ival = atol(yytext); + return SQL_INT; +} [A-Za-z][A-Za-z0-9_]* { yylval->sval = strdup(yytext); diff --git a/src/build_and_run_tests.sh b/src/build_and_run_tests.sh index b5bced0..e688a43 100644 --- a/src/build_and_run_tests.sh +++ b/src/build_and_run_tests.sh @@ -7,4 +7,4 @@ make clean make execution ./bin/sql_execution "SELECT a FROM foo WHERE a > 12 OR b > 3 AND c = 3" ./bin/sql_execution "SELECT col1, col2, 'test' FROM table, foo WHERE age > 12 AND zipcode = 12345 GROUP BY col1;" -./bin/sql_execution "SELECT * from table WHERE NOT a AND a = 12.5" +./bin/sql_execution "SELECT * from table WHERE (b OR NOT a) AND a = 12.5" diff --git a/src/lib/Expr.cpp b/src/lib/Expr.cpp index 2be7312..2cf99bd 100644 --- a/src/lib/Expr.cpp +++ b/src/lib/Expr.cpp @@ -24,18 +24,6 @@ Expr* makeFunctionRef(char* func_name, Expr* expr) { return e; } -Expr* makeFloatLiteral(float value) { - ALLOC_EXPR(e, kExprLiteralFloat); - e->float_literal = value; - return e; -} - -Expr* makeStringLiteral(char* string) { - ALLOC_EXPR(e, kExprLiteralString); - e->name = substr(string, 1, strlen(string)-1); - delete string; - return e; -} Expr* Expr::makeOpUnary(OperatorType op, Expr* expr) { @@ -46,6 +34,8 @@ Expr* Expr::makeOpUnary(OperatorType op, Expr* expr) { return e; } + + Expr* Expr::makeOpBinary(Expr* expr1, OperatorType op, Expr* expr2) { ALLOC_EXPR(e, kExprOperator); e->op_type = op; @@ -63,3 +53,25 @@ Expr* Expr::makeOpBinary(Expr* expr1, char op, Expr* expr2) { e->expr2 = expr2; return e; } + + + +Expr* Expr::makeLiteral(int64_t val) { + ALLOC_EXPR(e, kExprLiteralInt); + e->ival = val; + return e; +} + +Expr* Expr::makeLiteral(double value) { + ALLOC_EXPR(e, kExprLiteralFloat); + e->float_literal = value; + return e; +} + +Expr* Expr::makeLiteral(char* string) { + ALLOC_EXPR(e, kExprLiteralString); + e->name = substr(string, 1, strlen(string)-1); + delete string; + return e; +} + diff --git a/src/lib/Expr.h b/src/lib/Expr.h index 467cc57..18533df 100644 --- a/src/lib/Expr.h +++ b/src/lib/Expr.h @@ -8,6 +8,7 @@ typedef enum { kExprLiteralFloat, kExprLiteralString, + kExprLiteralInt, kExprStar, kExprColumnRef, kExprFunctionRef, @@ -48,6 +49,7 @@ struct Expr { Expr* expr2; char* name; float float_literal; + int64_t ival; OperatorType op_type; char op_char; @@ -55,6 +57,10 @@ struct Expr { static Expr* makeOpUnary(OperatorType op, Expr* expr); static Expr* makeOpBinary(Expr* expr1, char op, Expr* expr2); static Expr* makeOpBinary(Expr* expr1, OperatorType op, Expr* expr2); + + static Expr* makeLiteral(int64_t val); + static Expr* makeLiteral(double val); + static Expr* makeLiteral(char* val); }; // Zero initializes an Expr object and assigns it to a space in the heap @@ -70,8 +76,5 @@ struct Expr { Expr* makeColumnRef(char* name); Expr* makeFunctionRef(char* func_name, Expr* expr); -Expr* makeFloatLiteral(float value); -Expr* makeStringLiteral(char* string); - #endif diff --git a/src/lib/sqlhelper.cpp b/src/lib/sqlhelper.cpp index 5c40e74..3a94efa 100644 --- a/src/lib/sqlhelper.cpp +++ b/src/lib/sqlhelper.cpp @@ -7,10 +7,11 @@ void printExpression(Expr* expr, uint num_indent); void printOperatorExpression(Expr* expr, uint num_indent); const char* indent(uint num_indent) { return std::string(num_indent, '\t').c_str(); } -void inprint(int val, uint num_indent) { printf("%s%d\n", indent(num_indent), val); } +void inprint(int64_t val, uint num_indent) { printf("%s%ld \n", indent(num_indent), val); } void inprint(float val, uint num_indent) { printf("%s%f\n", indent(num_indent), val); } void inprint(const char* val, uint num_indent) { printf("%s%s\n", indent(num_indent), val); } -void inprint(char val, uint num_indent) { printf("%s%c\n", indent(num_indent), val); } +void inprintC(char val, uint num_indent) { printf("%s%c\n", indent(num_indent), val); } +void inprintU(uint64_t val, uint num_indent) { printf("%s%lu\n", indent(num_indent), val); } void printTableRefInfo(TableRef* table, uint num_indent) { switch (table->type) { @@ -30,11 +31,11 @@ void printOperatorExpression(Expr* expr, uint num_indent) { if (expr == NULL) { inprint("null", num_indent); return; } switch (expr->op_type) { - case SIMPLE_OP: inprint(expr->op_char, num_indent); break; + case SIMPLE_OP: inprintC(expr->op_char, num_indent); break; case AND: inprint("AND", num_indent); break; case OR: inprint("OR", num_indent); break; case NOT: inprint("NOT", num_indent); break; - default: inprint(expr->op_type, num_indent); break; + default: inprintU(expr->op_type, num_indent); break; } printExpression(expr->expr, num_indent+1); if (expr->expr2 != NULL) printExpression(expr->expr2, num_indent+1); @@ -45,6 +46,7 @@ void printExpression(Expr* expr, uint num_indent) { case kExprStar: inprint("*", num_indent); break; case kExprColumnRef: inprint(expr->name, num_indent); break; case kExprLiteralFloat: inprint(expr->float_literal, num_indent); break; + case kExprLiteralInt: inprint(expr->ival, num_indent); break; case kExprLiteralString: inprint(expr->name, num_indent); break; case kExprFunctionRef: /* todo */ break; case kExprOperator: printOperatorExpression(expr, num_indent); break;