⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parse.cpp

📁 编译器
💻 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 + -