📄 parse.cpp
字号:
#include "stdafx.h"
#include "Parse.h"
#include "MidNode.h"
#include "Lex.h"
#include "string.h"
Parse::Parse(char *sql)
{
query=new Query;
lex=new Lex(sql);
floor=0;
}
bool Parse::Parse_Operator(Operator *operator1)
{
operator1->value=lex->getToken()->field;
operator1->type=lex->getToken()->type;
return true;
}
bool Parse::Parse_Relation(Relation *relation)
{
if(!lex->getToken())return false;
// if(!lex->getNextToken())return false;
if(lex->getNextToken()->type==4)
{
relation->value=lex->getToken()->field;
relation->type=lex->getToken()->type;
return true;
}
return false;
}
bool Parse::Parse_Attri(Attri *attri)
{
if(!lex->getNextToken())return false;
if(lex->getToken()->type==4)
{
attri->value=lex->getToken()->field;
attri->type=lex->getToken()->type;
return true;
}
return false;
}
bool Parse::Parse_Digattri(DigAttri *digattri)
{
lex->getNextToken();
if(lex->getToken()->type==2||lex->getToken()->type==1||lex->getToken()->type==3||lex->getToken()->type==4)
{
digattri->value=lex->getToken()->field;
digattri->type=lex->getToken()->type;
return true;
}
return false;
}
bool Parse::Parse_Query(Query* query)
{
if(!lex->getNextToken())return false;
if(strcmp(lex->getToken()->field,"select")==0)
{
if(!Parse_SFW((SFW*)query->add( new SFW())))
{
return false;
}
}
else
{
if(strcmp(lex->getNextToken()->field,"(")==0)
{
if(!Parse_Operator((Operator*)query->add(new Operator())))
{
return false;
}
if(!Parse_Query((Query*)query->add(new Query())))
{
return false;
}
if(strcmp(lex->getNextToken()->field,")")==0)
{
if(!Parse_Operator((Operator*)query->add(new Operator())))
{
return false;
}
}
else
{
return false;
}
}
else
{
return false;
}
return true;
}
return true;
}
bool Parse::Parse_Condition(Condition *condition)
{
if(!Parse_Attri((Attri*)condition->add( new Attri())))
return false;
if(!lex->getNextToken())return false;
if(strcmp(lex->getToken()->field,"IN")==0)
{
if(!Parse_Operator((Operator*)condition->add( new Operator())))
return false;
if(!lex->getNextToken())return false;
if(strcmp(lex->getToken()->field,"(")==0)
{
//lex->back();
if(!Parse_Query((Query*)condition->add( new Query())))
return false;
}
else
return false;
}
else
{
if(!Parse_Operator((Operator*)condition->add( new Operator())))
return false;
if(!lex->getNextToken())return false;
if(strcmp(lex->getToken()->field,"(")==0)
{
lex->back();
if(!Parse_Query((Query*)condition->add( new Query())))
return false;
}
else
{
lex->back();
if(!Parse_Digattri((DigAttri*)condition->add( new DigAttri())))
return false;
}
}
return true;
}
bool Parse::Parse_SelList(SelList *sellist)
{
if(!Parse_Attri((Attri*)sellist->add(new Attri())))
return false;
if(strcmp(lex->getNextToken()->field,",")==0)
{
if(!Parse_SelList((SelList*)sellist->add(new SelList())))
return false;
}
else
lex->back();
return true;
}
bool Parse::Parse_FromList(FromList *fromlist)
{
if(!Parse_Relation((Relation*)fromlist->add(new Relation())))
return false;
if(!lex->getNextToken())
return false;
if(strcmp(lex->getToken()->field,",")==0)
{
if(!Parse_FromList((FromList*)fromlist->add(new FromList())))
return false;
}
else
lex->back();
return true;
}
bool Parse::Parse_ConditionList(ConditionList *conditionlist)
{
if(!Parse_Condition((Condition*)conditionlist->add( new Condition())))
{
return false;
}
Token *token=lex->getNextToken();
if(token==NULL)
return true;
if(token->type==7)
{
if(!Parse_Operator((Operator*)conditionlist->add( new Operator())))
{
return false;
}
if(!Parse_ConditionList((ConditionList*)conditionlist->add( new ConditionList())))
{
return false;
}
}
else
{
lex->back();
}
return true;
}
bool Parse::Parse_SFW(SFW* sfw)
{
floor++;
if(!Parse_SelList((SelList*)sfw->add(new SelList())))
return false;
if(strcmp(lex->getNextToken()->field,"from")==0)
{
if(!Parse_FromList((FromList*)sfw->add(new FromList())))
return false;
}
else return false;
if(!lex->hasNext()&&floor==1)
return true;
if(strcmp(lex->getNextToken()->field,"where")==0)
{
if(!Parse_ConditionList((ConditionList*)sfw->add(new ConditionList())))
return false;
}
else if(strcmp(lex->getToken()->field,")")==0&&floor>1)
{
lex->back();
return true;
}
else return false;
return true;
}
bool Parse::Parse_Query1()
{
if(strcmp(lex->getNextToken()->field,"select")==0)
{
if(!Parse_SFW((SFW*)query->add(new SFW())))
return false;
}
else
{
return false;
}
return true;
}
Query* Parse::parser()
{
if(Parse_Query1()&&!lex->hasNext())
return query;
else
return NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -