📄 fenxi.cpp
字号:
{
TOKEN token;
token=accidence(infile,irow,1); //begin
if(token.iType!=KEYWORD ||token.dProperty!='b')
{
WriteError("缺少关键字begin",token.iPosition);
return false;
}
if(!OptionalStatements(buffer))
{
return false;
}
token=accidence(infile,irow,1); //end
if(token.iType==KEYWORD && token.dProperty=='e')
{
return true;
}
WriteError("缺少关键字end",token.iPosition);
return false;
}
bool OptionalStatements(char *buffer) //N
{
TOKEN token;
char temp[2048]={0};
token=accidence(infile,irow,0);
if((token.iType==DESIGNATOR) //id
||(token.iType==KEYWORD &&
(token.dProperty=='b' //begin
||token.dProperty=='w'//while
||token.dProperty=='i'//if
||token.dProperty=='x'
||token.dProperty=='y')))
{
if(!Statement(buffer))
{
return false;
}
if(!StatementList(temp))
{
return false;
}
strcat(buffer,temp);
return true;
}
else if(token.iType==KEYWORD && token.dProperty=='e') //end,N->空
{
return true;
}
WriteError("语句错误",token.iPosition);
return false;
}
bool Statement(char *buffer) //P
{
TOKEN token;
int iPlace;
int line;
char statement[4096]={0};
char statement1[4096]={0};
char ex[1024]={0};
token=accidence(infile,irow,0);
if(token.iType==DESIGNATOR) //P → id R;
{
token=accidence(infile,irow,1);
int i=GetType(token.dProperty);
if(INVALIDETYPE>=GetType(token.dProperty))
{
WriteError("未声明的标识符",token.iPosition);
}
if(!Variable(token.dProperty,buffer))
{
return false;
}
token=accidence(infile,irow,1);
if(token.iType!=KEYWORD ||token.dProperty!=';')
{
WriteError("缺少分号",token.iPosition);
}
return true;
}
else if(token.iType==KEYWORD)
{
if(token.dProperty=='b') //P->E
{
return CompoundStatement(buffer);
}
else if(token.dProperty=='i') //P-> if S then P else P
{
token=accidence(infile,irow,1);
if(!Expression(&iPlace,ex))
{
return false;
}
token=accidence(infile,irow,1); //then
if(token.iType!=KEYWORD ||token.dProperty!='t')
{
WriteError("错误的if语句",token.iPosition);
return false;
}
iCodeLine++;
if(!Statement(statement))
{
return false;
}
line=iCodeLine;
token=accidence(infile,irow,1); //else
if(token.iType!=KEYWORD ||token.dProperty!='s')
{
WriteError("错误的if语句",token.iPosition);
return false;
}
if(!Statement(statement1))
{
return false;
}
sprintf(buffer,"%sif %d E 0.0 goto %d\r\n%sgoto %d\r\n%s",ex,iPlace,line+1,statement,iCodeLine+1,statement1);
iCodeLine++;
return true;
}
else if(token.dProperty=='w')// P->while S do P
{
token=accidence(infile,irow,1);
line=iCodeLine;
if(!Expression(&iPlace,ex))
{
return false;
}
token=accidence(infile,irow,1);
if(token.iType!=KEYWORD ||token.dProperty!='d')
{
WriteError("错误的循环语句",token.iPosition);
return false;
}
iCodeLine++;
if(!Statement(statement))
{
return false;
}
sprintf(buffer,"%sif %d E 0.0 goto %d\r\n%sgoto %d\r\n",ex,iPlace,iCodeLine+1,statement,line);
iCodeLine+=1;
return true;
}
else if(token.dProperty=='x'||token.dProperty=='y') //P->read(id) 或P->write(id)
{
token=accidence(infile,irow,1);
char property=token.dProperty;
token=accidence(infile,irow,1);//(
if(token.iType!=KEYWORD ||token.dProperty!='(')
{
WriteError("非法的函数调用",token.iPosition);
return false;
}
buffer[0]=0;
while(1)
{
token=accidence(infile,irow,1);//id
int pos=token.dProperty;
if(token.iType!=DESIGNATOR)
{
WriteError("非法的函数调用",token.iPosition);
return false;
}
token=accidence(infile,irow,1); //)或,[
if(token.iType==KEYWORD && token.dProperty=='[')
{
int lable;
if(!Expression(&lable,statement))
{
return false;
}
if(lable<table.getDimension(pos))
{
WriteError("数组下界越界",token.iPosition);
}
strcat(buffer,statement);
int temp=Insert(INTEGER,2);
if(property=='x')
{
sprintf(statement,"%d = %d.0\r\n%d = %d - %d\r\nparam %d[%d]\r\ncall read\r\n"
,temp,table.getDimension(pos),temp,temp,lable,pos,temp);
}
else if(property=='y')
{
sprintf(statement,"%d = %d.0\r\n%d = %d - %d\r\nparam %d[%d]\r\ncall write\r\n"
,temp,table.getDimension(pos),temp,temp,lable,pos,temp);
}
iCodeLine+=4;
strcat(buffer,statement);
token=accidence(infile,irow,1);
if(token.iType==KEYWORD &&token.dProperty==']')
{
WriteError("错误的数组引用",token.iPosition);
}
token=accidence(infile,irow,1);
}
else
{
if(property=='x')
{
sprintf(statement,"param %d\r\ncall read\r\n",pos);
}
else if(property=='y')
{
sprintf(statement,"param %d\r\ncall write\r\n",pos);
}
strcat(buffer,statement);
iCodeLine+=2;
}
//token=accidence(infile,irow,1); //)或,[
if(token.iType==KEYWORD &&token.dProperty==',')
{
continue;
}
else if(token.iType==KEYWORD && token.dProperty==')')
{
break;
}
else
{
WriteError("非法的函数调用,缺少')'",token.iPosition);
return false;
}
}
token=accidence(infile,irow,1); //;
if(token.iType!=KEYWORD ||token.dProperty!=';')
{
WriteError("错误的表达式,缺少';'",token.iPosition);
}
return true;
}
WriteError("非法的关键字",token.iPosition);
return false;
}
else if(token.iType==KEYWORD && token.dProperty=='e')
{
return true;
}
WriteError("错误的表达式",token.iPosition);
return false;
}
bool StatementList(char* buffer) //Q
{
TOKEN token;
char temp[2048]={0};
token=accidence(infile,irow,0);
if(token.iType==KEYWORD)
{
if(token.dProperty=='e') //Q->空
{
return true;
}
if(token.dProperty=='i'||token.dProperty=='w'||token.dProperty=='b'
||token.dProperty=='x'||token.dProperty=='y')
{
token.iType=DESIGNATOR;
}
}
if(token.iType==DESIGNATOR) //Q→P Q
{
//token=accidence(infile,irow,1);
if(!Statement(buffer))
{
return false;
}
if(!StatementList(temp))
{
return false;
}
strcat(buffer,temp);
return true;
}
WriteError("错误的表达式",token.iPosition);
return false;
}
/**/
bool Variable(int iPlace,char *buffer)//R
{
TOKEN token;
char ex[1024]={0};
char ex1[1024]={0};
char temp[100]={0};
int place,subplace;
int Argument[10],num=0;
token=accidence(infile,irow,0);
if(token.iType==KEYWORD)
{
if(token.dProperty=='e' ||token.dProperty==';')//R->空
{
if(GetType(iPlace)==PROC) //过程
{
sprintf(buffer,"call %d\r\n",iPlace);
}
else
{
sprintf(buffer,"%d\r\n",iPlace);
}
// WriteCode(buffer);
iCodeLine++;
return true;
}
else if(token.dProperty=='[')//R→[ S] assignop S
{
token=accidence(infile,irow,1);
if(!Expression(&subplace,ex))
{
return false;
}
token=accidence(infile,irow,1);
if(token.iType!=KEYWORD ||token.dProperty!=']')
{
WriteError("错误的赋值语句",token.iPosition);
return false;
}
token=accidence(infile,irow,1);
if(token.iType!=ASSIGN_OP)
{
WriteError("错误的赋值语句",token.iPosition);
return false;
}
if(!Expression(&place,ex1))
{
return false;
}
sprintf(buffer,"%s%s%d[%d] = %d\r\n",ex,ex1,iPlace,subplace,place);
// WriteCode(buffer);
iCodeLine++;
if(GetType(iPlace)!=GetType(place)+2)
{
WriteError("类型不匹配",token.iPosition);
}
return true;
}
else if(token.dProperty=='(')//R->(SU)
{//yjl
token=accidence(infile,irow,1);
if(!Expression(Argument,ex))
{
return false;
}
num++;
if(!ExpressionList(Argument,&num,ex1))
{
return false;
}
token=accidence(infile,irow,1);
if(token.iType!=KEYWORD || token.dProperty!=')')
{
WriteError("缺少')'",token.iPosition);
}
sprintf(buffer,"%s%s",ex,ex1);
for(int i=0;i<num;i++)
{
if(GetType(Argument[i])!=GetType(table.getParam(iPlace,i)))
{
WriteError("类型不匹配",token.iPosition);
}
sprintf(temp,"param %d\r\n",Argument[i]);
strcat(buffer,temp);
}
sprintf(temp,"call %d\r\n",iPlace);
strcat(buffer,temp);
iCodeLine+=num+1;
return true;
}
}
else if(token.iType==2) //R->assign S
{
token=accidence(infile,irow,1);
if(!Expression(&place,ex))
{
return false;
}
sprintf(buffer,"%s%d = %d\r\n",ex,iPlace,place);
iCodeLine++;
if(GetType(iPlace)!=GetType(place))
{
WriteError("类型不匹配",token.iPosition);
}
return true;
}
WriteError("错误的赋值语句",token.iPosition);
return false;
}
bool Expression(int *iPlace,char *buffer) //S
{
int place;
char se[1024]={0};
char ex[1024]={0};
if(!SimpleExpression(&place,se))
{
return false;
}
if(!Expression1(&place,ex))
{
return false;
}
sprintf(buffer,"%s%s",se,ex);
*iPlace=place;
return true;
}
/**/
bool ExpressionList(int *iPlace,int * num,char *buffer) //U
{
TOKEN token;
char ex[512]={0};
char exlst[512]={0};
token=accidence(infile,irow,0);
if(token.iType==KEYWORD && token.dProperty==',') //U->,SU
{
token=accidence(infile,irow,1);
if(!Expression(iPlace+(*num),ex))
{
return false;
}
(*num)++;
if(!ExpressionList(iPlace,num,exlst))
{
return false;
}
sprintf(buffer,"%s%s",ex,exlst);
return true;
}
return true;
}
bool Expression1(int *iPlace,char *buffer) //W
{
TOKEN token;
int place,temp;
char se[1024]={0};
token=accidence(infile,irow,0);
if(token.iType==RELOP) //W->relop V
{
token=accidence(infile,irow,1);
if(!SimpleExpression(&place,se))
{
return false;
}
if(GetType(*iPlace)!=GetType(place))
{
WriteError("类型不匹配",token.iPosition);
}
temp=Insert(BOOL,2);
sprintf(buffer,"%sif %d %c %d goto %d\r\n%d = 0.0\r\ngoto %d\r\n %d = 1.0\r\n"
,se,*iPlace,(char)token.dProperty,place,iCodeLine+3,temp,iCodeLine+4,temp);
// WriteCode(buffer);
iCodeLine+=4;
*iPlace=temp;
return true;
}
else if(token.iType==KEYWORD &&(token.dProperty==',' ||token.dProperty==')')) //W->空
{
return true;
}
return true;
}
/**/
bool SimpleExpression(int *iPlace,char *buffer)//V
{
TOKEN token;
int place=0,temp;
token=accidence(infile,irow,0);
char factor[512]={0};
char term[512]={0};
char se[512]={0};
if(token.iType==ADD_OP &&(token.dProperty=='+' ||token.dProperty=='-'))
{
token=accidence(infile,irow,1);
}
if(!Factor(&place,factor))
{
return false;
}
if(!Term(&place,term))
{
return false;
}
if(!SimpleExpression1(&place,se))
{
return false;
}
if(token.iType==ADD_OP &&(token.dProperty=='-'))
{
temp=Insert(GetType(place),2);
sprintf(buffer,"%s%s%s%d = - %d\r\n",factor,term,se,temp,place);
iCodeLine++;
*iPlace=temp;
}
else
{
temp=Insert(GetType(place),2);
sprintf(buffer,"%s%s%s%d = %d\r\n",factor,term,se,temp,place);
iCodeLine++;
*iPlace=temp;
}
return true;
}
bool Factor(int *iPlace,char *buffer) //Z
{
TOKEN token;
int place=-1,temp;
char factor[1024]={0};
token=accidence(infile,irow,1);
if(token.iType==DESIGNATOR) //Z->idX
{
int i=GetType(token.dProperty);
if(INVALIDETYPE>=GetType(token.dProperty))
{
WriteError("未声明的标识符",token.iPosition);
}
place=token.dProperty;
if(!Factor1(&place,buffer))
{
return false;
}
if(place!=-1)
{
*iPlace=place;
}
else
{
*iPlace=token.dProperty;
}
return true;
}
else if(token.iType==NUM)
{
place=Insert(REAL,REALWIDTH);
sprintf(buffer,"%d = %f\r\n",place,token.dProperty);
// WriteCode(buffer);
*iPlace=place;
iCodeLine++;
return true;
}
else if(token.iType==KEYWORD && token.dProperty=='(') //Z->( S )
{
if(!Expression(&place,buffer))
{
return false;
}
token=accidence(infile,irow,1);
if(token.iType!=KEYWORD ||token.dProperty!=')')
{
WriteError("缺少')'",token.iPosition);
return false;
}
*iPlace=place;
return true;
}
else if(token.iType==KEYWORD && token.dProperty=='!')
{
if(!Factor(&place,factor))
{
return false;
}
temp=Insert(BOOL,2);
sprintf(buffer,"%s%d = ! %d\r\n",factor,temp,place);
// WriteCode(buffer);
iCodeLine++;
*iPlace=temp;
return true;
}
WriteError("错误的赋值语句",token.iPosition);
return false;
}
/**/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -