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 <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "Parser.h"
|
#include "Parser.h"
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
using namespace std;
|
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)
|
vector<string> showCMD(vector<string> input, DBEngine &engine)
|
||||||
{
|
{
|
||||||
if (input.size() > 3)
|
if (input.size() > 3)
|
||||||
|
@ -358,16 +529,11 @@ vector<string> insertCMD(vector<string> input, DBEngine &engine)
|
||||||
{
|
{
|
||||||
input.erase(input.begin());
|
input.erase(input.begin());
|
||||||
|
|
||||||
//PExpression e;
|
tuple<vector<string>, Relation> t = expression(input, engine);
|
||||||
|
|
||||||
// while(input[0] != ";")
|
engine.createTable(get<1>(t));
|
||||||
// {
|
|
||||||
// e.setPExpression(e.getPExpression() + input[0]);
|
|
||||||
// }
|
|
||||||
|
|
||||||
//cout << "Inserting: " << e.getPExpression() << " into " << r.getName() << ".\n";
|
input = get<0>(t);
|
||||||
|
|
||||||
cout << "Not yet implemented." << endl;
|
|
||||||
|
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
@ -507,104 +673,6 @@ vector<string> deleteCMD(vector<string> input, DBEngine &engine)
|
||||||
else cout<<"Syntax error!"<<endl;
|
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)
|
vector<string> query(vector<string> input, DBEngine &engine)
|
||||||
{
|
{
|
||||||
PRelation pr(input[0]);
|
PRelation pr(input[0]);
|
||||||
|
@ -612,66 +680,11 @@ vector<string> query(vector<string> input, DBEngine &engine)
|
||||||
input.erase(input.begin());
|
input.erase(input.begin());
|
||||||
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.setTableName(pr.getName());
|
||||||
//r.display();
|
//r.display();
|
||||||
|
input = get<0>(t);
|
||||||
//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;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
engine.createTable(r);
|
engine.createTable(r);
|
||||||
|
|
||||||
|
|
BIN
test
BIN
test
Binary file not shown.
Reference in a new issue