📄 lexical.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 + -