Deleted some useless code. Fixing more complicated parser bugs.
This commit is contained in:
parent
28facf2997
commit
1f6fa55754
2 changed files with 177 additions and 164 deletions
341
Parser.cpp
341
Parser.cpp
|
@ -5,6 +5,7 @@
|
|||
#include <vector>
|
||||
#include <string>
|
||||
#include "Parser.h"
|
||||
#include <tuple>
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
@ -41,6 +42,176 @@ void displayTokenList(vector<string> input)
|
|||
}
|
||||
}
|
||||
|
||||
tuple<vector<string>, Relation> expression(vector<string> input, DBEngine &engine)
|
||||
{
|
||||
Relation rfinal("TEMP");
|
||||
tuple<vector<string>, Relation> t(input, rfinal);
|
||||
if(input[0] == "select")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(input[0] == "project")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(input[0] == "rename")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r1(engine.getTableFromName(input[0]));
|
||||
input.erase(input.begin());
|
||||
|
||||
if(input[0] == "+")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r2(engine.getTableFromName(input[0]));
|
||||
rfinal = engine.setUnion(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
tuple<vector<string>, Relation> t = expression(input, engine);
|
||||
Relation r2 = get<1>(t);
|
||||
rfinal = engine.setUnion(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
else if(input[0] == "-")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r2(engine.getTableFromName(input[0]));
|
||||
rfinal = engine.setDiff(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
tuple<vector<string>, Relation> t = expression(input, engine);
|
||||
Relation r2 = get<1>(t);
|
||||
rfinal = engine.setDiff(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
else if(input[0] == "*")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r2(engine.getTableFromName(input[0]));
|
||||
rfinal = engine.crossProduct(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
tuple<vector<string>, Relation> t = expression(input, engine);
|
||||
Relation r2 = get<1>(t);
|
||||
rfinal = engine.crossProduct(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
|
||||
Relation r1(engine.getTableFromName(input[0]));
|
||||
input.erase(input.begin());
|
||||
|
||||
if(input[0] == "+")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r2(engine.getTableFromName(input[0]));
|
||||
rfinal = engine.setUnion(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
tuple<vector<string>, Relation> t = expression(input, engine);
|
||||
Relation r2 = get<1>(t);
|
||||
rfinal = engine.setUnion(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
else if(input[0] == "-")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r2(engine.getTableFromName(input[0]));
|
||||
rfinal = engine.setDiff(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
tuple<vector<string>, Relation> t = expression(input, engine);
|
||||
Relation r2 = get<1>(t);
|
||||
rfinal = engine.setDiff(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
else if(input[0] == "*")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r2(engine.getTableFromName(input[0]));
|
||||
rfinal = engine.crossProduct(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
tuple<vector<string>, Relation> t = expression(input, engine);
|
||||
Relation r2 = get<1>(t);
|
||||
rfinal = engine.crossProduct(r1, r2);
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get<0>(t) = input;
|
||||
get<1>(t) = rfinal;
|
||||
return t;
|
||||
}
|
||||
|
||||
vector<string> showCMD(vector<string> input, DBEngine &engine)
|
||||
{
|
||||
if (input.size() > 3)
|
||||
|
@ -358,16 +529,11 @@ vector<string> insertCMD(vector<string> input, DBEngine &engine)
|
|||
{
|
||||
input.erase(input.begin());
|
||||
|
||||
//PExpression e;
|
||||
tuple<vector<string>, Relation> t = expression(input, engine);
|
||||
|
||||
// while(input[0] != ";")
|
||||
// {
|
||||
// e.setPExpression(e.getPExpression() + input[0]);
|
||||
// }
|
||||
engine.createTable(get<1>(t));
|
||||
|
||||
//cout << "Inserting: " << e.getPExpression() << " into " << r.getName() << ".\n";
|
||||
|
||||
cout << "Not yet implemented." << endl;
|
||||
input = get<0>(t);
|
||||
|
||||
return input;
|
||||
}
|
||||
|
@ -507,104 +673,6 @@ vector<string> deleteCMD(vector<string> input, DBEngine &engine)
|
|||
else cout<<"Syntax error!"<<endl;
|
||||
}
|
||||
|
||||
Relation expression(vector<string> input, DBEngine &engine)
|
||||
{
|
||||
Relation rfinal("TEMP");
|
||||
if(input[0] == "select")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(input[0] == "project")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(input[0] == "rename")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r1(engine.getTableFromName(input[0]));
|
||||
input.erase(input.begin());
|
||||
|
||||
if(input[0] == "+")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r2(engine.getTableFromName(input[0]));
|
||||
rfinal = engine.setUnion(r1, r2);
|
||||
return rfinal;
|
||||
}
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
Relation r2 = expression(input, engine);
|
||||
rfinal = engine.setUnion(r1, r2);
|
||||
return rfinal;
|
||||
}
|
||||
}
|
||||
|
||||
else if(input[0] == "-")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r2(engine.getTableFromName(input[0]));
|
||||
rfinal = engine.setDiff(r1, r2);
|
||||
return rfinal;
|
||||
}
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
Relation r2 = expression(input, engine);
|
||||
rfinal = engine.setDiff(r1, r2);
|
||||
return rfinal;
|
||||
}
|
||||
}
|
||||
|
||||
else if(input[0] == "*")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
if(engine.isRelation(input[0]))
|
||||
{
|
||||
Relation r2(engine.getTableFromName(input[0]));
|
||||
rfinal = engine.crossProduct(r1, r2);
|
||||
return rfinal;
|
||||
}
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
Relation r2 = expression(input, engine);
|
||||
rfinal = engine.crossProduct(r1, r2);
|
||||
return rfinal;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if(input[0] == "(")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
|
||||
if(input[0] == "+")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(input[0] == "-")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(input[0] == "*")
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return rfinal;
|
||||
}
|
||||
|
||||
vector<string> query(vector<string> input, DBEngine &engine)
|
||||
{
|
||||
PRelation pr(input[0]);
|
||||
|
@ -612,66 +680,11 @@ vector<string> query(vector<string> input, DBEngine &engine)
|
|||
input.erase(input.begin());
|
||||
input.erase(input.begin());
|
||||
|
||||
Relation r = expression(input, engine);
|
||||
tuple<vector<string>, Relation> t = expression(input, engine);
|
||||
Relation r = get<1>(t);
|
||||
r.setTableName(pr.getName());
|
||||
//r.display();
|
||||
|
||||
//temporary fix
|
||||
while(input[0] != ";")
|
||||
{
|
||||
input.erase(input.begin());
|
||||
}
|
||||
|
||||
/*
|
||||
if(input[0] == "select")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(input[0] == "project")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(input[0] == "rename")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(engine.isRelation())
|
||||
{
|
||||
Relation r(engine.getTableFromName(input[0]));
|
||||
input.erase(input.begin());
|
||||
|
||||
if(input[0] == "+")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(input[0] == "-")
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
else if(input[0] == "*")
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
cout << "Invalid query request." << endl;
|
||||
}
|
||||
*/
|
||||
|
||||
//testing
|
||||
/*
|
||||
for(int x = 0; x < input.size(); ++x)
|
||||
{
|
||||
cout << input[x] << endl;
|
||||
}
|
||||
*/
|
||||
input = get<0>(t);
|
||||
|
||||
engine.createTable(r);
|
||||
|
||||
|
|
BIN
test
BIN
test
Binary file not shown.
Reference in a new issue