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

📄 lexical.cpp

📁 实现编译器的词法分析
💻 CPP
字号:
#include "Global.h"
#include "Lexical.h"



Lexical::Lexical( std::ifstream * inputfilep)
{
	
    beffer=new char[BSIZE];
	forward=0;
	lexeme_beginning=0;
	state=0;
	line=1;
	mode=0;
	lockload=0;
	eof=0;
	lexeme_beginning=0;
	this->inputfile =inputfilep;
    inputfile->get(beffer,BSIZE/2,E0F);
	
}

char Lexical::nextchar()
{

switch(mode)
{
case 1:lexeme_beginning=forward;mode=0;
case 0:{
if(beffer[forward]==EOF0)
{
 
	if(forward==BSIZE/2-1){if(lexeme_beginning>=BSIZE/2){std::cout<<"标识符过长!"<<std::endl;exit(0);} {if(lockload==0)inputfile->get(beffer+BSIZE/2,BSIZE/2,E0F);else lockload=0; }forward++;}
	if(forward==BSIZE-1){if(lexeme_beginning<BSIZE/2){std::cout<<"标识符过长!"<<std::endl;exit(0);}{if(lockload==0)inputfile->get(beffer,BSIZE/2,E0F);else lockload=0; }forward=0;}
	if(beffer[forward]==EOF0){forward++;eof=1;return  EOF0;}
}

if(this->lexeme_beginning==BSIZE-1)this->lexeme_beginning=0;
if(this->lexeme_beginning==BSIZE/2-1)this->lexeme_beginning =BSIZE/2;

}break;

case 2:
	{mode=0;
	forward=(forward-1)%BSIZE;
	if(beffer[forward]==EOF0){forward=(forward-1)%BSIZE;lockload=1;}
	
    lexeme_beginning=forward;
	}
}
return beffer[forward++];
}

bool Lexical::isletter(char c){return (c>='a'&&c<='z')||(c>='A'&&c<='Z');}
bool Lexical::isdigit(char c){return (c>='0'&&c<='9');}

void Lexical::copyword()
{int i;
	
    if(forward>this->lexeme_beginning)
	{
		if((forward>BSIZE/2-1)&&this->lexeme_beginning<BSIZE/2-1)
		{for(i=lexeme_beginning;i<BSIZE/2-1;i++) word[i-lexeme_beginning]=beffer[i];
		 for(i=BSIZE/2;i<forward-1;i++)	word[i-lexeme_beginning-1]=beffer[i];
        word[i-lexeme_beginning-1]=0;
		}

		else{
		
    	  for(i=lexeme_beginning;i<forward-1;i++)
		  word[i-lexeme_beginning]=beffer[i];
          word[i-lexeme_beginning]=0;

		}

   }


else
{
	 for(i=lexeme_beginning;i<BSIZE-1;i++)	word[i-lexeme_beginning]=beffer[i];
	 for(i=0;i<forward-1;i++)word[BSIZE-1-lexeme_beginning+i]=beffer[i];
	 word[BSIZE-1-lexeme_beginning+i]=0;
}
	



}



Token Lexical::nexttoken()
{   char c;
state=0;
if(eof==true) {this->value=0;return E0F;}
	while(1)
	{
	c=this->nextchar();
	switch(state)
	{
	case 0:
		 	  
		  switch(c)
		  { case EOF0:this->value=0;return E0F;
		    case BLANK:
			case TAB:
			case ',':
			case ';':
		
			case '(':
			case ')':
		    case '\'':
			
			case NEWLINEA:state=0;mode=1;if(c==NEWLINEA)line++;break;
		    case '.':mode=1;return PROEND;
			case '<':state=1;break;
			case '=':value =EQ;mode=1;return RELOP;
			case '>':state=2;break;
			case ':':state=3;break;
			case '+':value ='+';mode=1;return ADD_OP;
			case '-':value='-';mode=1;return ADD_OP;
			case '*':value='*';mode=1;return MULT_OP;
			case '/':value='/';mode=1;return MULT_OP;
			default: if(isletter(c))state =4;
		   	       	if(isdigit(c))state=5;
		  }
		  break;
	case 1:
		
          switch(c)
		  {
		    case '=':value=LE;mode=1;return RELOP;
			case '>':value=NE;mode=1;return RELOP;
			default:value =LT;mode=2;return RELOP;
		  }
		  break;
     
	case 2: 
          switch(c)
		  {
		    case '=':value=GE;mode=1;return RELOP;break;
			default:value =GT;mode=2;return RELOP;
		  }
		  break;

	case 3:
		if(c=='='){value=0;mode=1;return ASSIGN_OP;}
		else
		{value=0;mode=2;return DECLAER;}

		//	else{ std::cout<<"line(" << line <<")error"<<std::endl;exit(0);}
	case 4:
		if(this->isdigit(c)||this->isletter(c)) {state=4;}
		else
		{
    	
			
		return gettoken(0);

		}break;
	case 5:
		{
		if(isdigit(c)){state=5;break;}
		if(c=='.'){state=6;break;}
		if(c=='E'){state=8;break;}
       
	
		
		return gettoken(1);
		}
	case 6:
		{
		if(isdigit(c))state=7;
		else
		{std::cout<<"error"<<std::endl;exit(0);}
      

		}
		 break;
	case 7:
	{
	
		if(isdigit(c)){state=7; break;}
		if(c=='E'){state=8;break;}
	
			
		return  gettoken(1);;				
	
	}
	case 8:
		{
		if(isdigit(c)){state=10;break;}
		if(c=='+'||c=='-'){state=9;break;}
  
		
		}
	case 9:
		{

		   if(isdigit(c)){state=10;break;}

		}
	case 10:
		{ 
		  
			if(isdigit(c)){state=10;break;}
    		return gettoken(1);			
		
		}
		
	}
	}


}
Token Lexical::gettoken(int digitnum)
{  

	  int t;
	  mode=2;
	  word=new char[(forward-this->lexeme_beginning+BSIZE)%BSIZE];
	  copyword();		
      t=this->Lookup(word);
	  if(digitnum==0)
	  {
		if(!t)
		{
			this->tok=ID;
			this->value=this->Insert(word,ID);
		}
		else
		{

		if(t<=KEYMAX)
		{this->tok=CONST+t-1;
		this->value=0;
		
		}
		else
		{
			this->tok=ID;
			this->value=t;
		}
		}
		
	  }
	  else
	  {
		if(!t)
		{
			this->tok=NUMBER;
			this->value=this->Insert(word,NUMBER);
		}
		else
		{
		
			this->tok=NUMBER;
			this->value=t;
		}

	  
	  }
	 
	  return this->tok ;
}


Lexical::~Lexical(void)
{
	delete [] beffer;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -