📄 unit1.cpp
字号:
if(TABLE[ii].KIND==CONSTANT && TABLE[ii].TYPE==INTCON)
//是检测常数的数据类型是否为整型,字符和实型均不可接受
{
DOWNARR=TABLE[ii].VAL;
}
else
{
DOWNARR=0;
Error(91); //存在于表中,但非常数
}
}//if下界
GetSym();
if(SYM==SQRPAREN) //SQRPAREN 代表 ']'符号
{
GetSym();
if(SYM==OFSYM)
GetSym();
else Error(93);
}
else Error(93); //数组定义不正确
if(SYM==INTEGERSYM || SYM==REALSYM || SYM==CHARSYM )
{
switch(SYM)
{
case INTEGERSYM: tm=INTCON; break;
case REALSYM : tm=REALCON; break;
case CHARSYM : tm=CHARCON; break;
}
for(i=0;i<count;i++)
ENTER(ARR,tm,LEV,TX,DX,VARS[i],FALSE); //定义数组
}else Error(92);
}else Error(92);
}
else
if(SYM==INTEGERSYM || SYM==REALSYM || SYM==CHARSYM )
{
switch(SYM)
{
case INTEGERSYM: tm=INTCON; break;
case REALSYM : tm=REALCON; break;
case CHARSYM : tm=CHARCON; break;
}
for(i=0;i<count;i++)
ENTER(VARIABLE,tm,LEV,TX,DX,VARS[i],FALSE); //定义变量
}
else Error(4);
GetSym();
} /*VarDeclaration()*/
//++++++++++++++++++++++++++end
//---------------------------------------------------------------------------
void ListCode(int CX0)
{ /*LIST CODE GENERATED FOR THIS Block*/
if (Form1->ListSwitch->ItemIndex==0)
for (int i=CX0; i<CX; i++)
{
String s=IntToStr(i);
while(s.Length()<3)s=" "+s;
if(CODE[i].A-(int)CODE[i].A!=0)
{
s=s+" "+MNEMONIC[CODE[i].F]+" "+IntToStr(CODE[i].L)+" "+IntToStr((int)CODE[i].A)+"."+IntToStr((int)((CODE[i].A-(int)CODE[i].A)*10000));
fprintf(FOUT,"%3d%5s%4d%4.4f\n",i,MNEMONIC[CODE[i].F],CODE[i].L,CODE[i].A);
}
else
{
s=s+" "+MNEMONIC[CODE[i].F]+" "+IntToStr(CODE[i].L)+" "+IntToStr((int)CODE[i].A);
fprintf(FOUT,"%3d%5s%4d%4d\n",i,MNEMONIC[CODE[i].F],CODE[i].L,(int)CODE[i].A);
}
Form1->printfs(s.c_str());
// fprintf(FOUT,"%3d%5s%4d%4f\n",i,MNEMONIC[CODE[i].F],CODE[i].L,CODE[i].A);
}
} /*ListCode()*/
//-------------+++++++++++++++---------数组偏移地址处理过程
void ARRGetSub(SYMSET FSYS, int LEV,int &TX)
{
GetSym();
if(SYM==SQLPAREN) //数组的语法为 <数组名> [ 运算表达式 ];
{
GetSym();
WNUMK=1; //因为数组中只能进行,整型的运算,所以对下面的运算只能调用一类运算,WNUMK是全局变量
EXPRESSION(SymSetUnion(SymSetNew(SQRPAREN),FSYS),LEV,TX);
WNUMK=0;
//GetSym();
if(SYM!=SQRPAREN)
Error(93); //数组定义不正确
}
else Error(93);
//if(arr)
}
//----------------++++++++++++++---------------
//---------------------------------------------------------------------------
void FACTOR(SYMSET FSYS, int LEV, int &TX) {
int i,jk,tm;
jk=0;
tm=0;
FCT STOMode[3]={STO,STOARR,STOVAR}; //这里是后面加入的对数组的运算实现代码 STOARR和LODARR
FCT LODMode[3]={LOD,LODARR,LODVAR};
TEST(FACBEGSYS,FSYS,24);
while (SymIn(SYM,FACBEGSYS)) {
if (SYM==IDENT) {
i=POSITION(ID,TX);
if (i==0) Error(11);
else if((TABLE[i].TYPE==REALCON && WNUMK==1)||TABLE[i].TYPE==CHARCON)
Error(32);//类型不匹配,字符型不可以参加运算
else
switch (TABLE[i].KIND) {
case CONSTANT: GEN(LIT,0,TABLE[i].VAL); break;
case VARIABLE:
if(TABLE[i].IsVAR)
{
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
jk=2;
tm=1;
}
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
break;
case PROCEDUR: Error(21); break;
//------------------------------------------------------------在表达式中的函数计算
case FUNCTION:
ParaGetSub(FSYS,LEV,TX,i); //函数参数处理过程调用
GEN(CAL,LEV-TABLE[i].vp.LEVEL,TABLE[i].CS); //生成调用函数的代码
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); //读出函数的返回值,我是直接把函数的返回值放在函数名变量所在的地址位置.
break;
//-----------------------------------------------------------
case ARR: //数组处理
jk=1;
ARRGetSub(FSYS,LEV,TX); //调用数组的偏移地址处理
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);//读出数组元素的值,放入栈顶
break;
}
GetSym();
//++++++++++++++++++++ START ++ -- //变量自加运算
if(SYM==PP)
{
GetSym();
GEN(LIT,0,1);
GEN(OPR,0,2);
GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}
else if(SYM==MM) //变量自减运算
{
GetSym();
GEN(LIT,0,1);
GEN(OPR,0,3);
GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}
//++++++++++++++++++++ end ++ --
}
else
if (SYM==INTS || SYM==REALS) {
if (NUM>AMAX && SYM==INTS) { Error(31); NUM=0; }
if (NUM>RMAX && SYM==REALS){ Error(31); NUM=0;}
if (WNUMK && SYM==REALS) { Error(32); NUM=0;} //类型不匹配
GEN(LIT,0,NUM); GetSym();
if(SYM==PP) //数字自加运算
{
GetSym();
GEN(LIT,0,1);
GEN(OPR,0,2);
}
else if(SYM==MM) //数字自减运算
{
GetSym();
GEN(LIT,0,1);
GEN(OPR,0,3);
}
}
else
if (SYM==LPAREN) {
GetSym(); EXPRESSION(SymSetAdd(RPAREN,FSYS),LEV,TX);
if (SYM==RPAREN) GetSym();
else Error(22);
}
TEST(FSYS,FACBEGSYS,23);
}
}/*FACTOR*/
//---------------------------------------------------------------------------
void TERM(SYMSET FSYS, int LEV, int &TX) { /*TERM*/
SYMBOL MULOP;
FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH,DIVSYM,MODSYM)), LEV,TX);
while (SYM==TIMES || SYM==SLASH || SYM==DIVSYM || SYM==MODSYM)
{
MULOP=SYM; GetSym();
FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH,DIVSYM,MODSYM)),LEV,TX);
switch(MULOP)
{
case TIMES: GEN(OPR,0,4); break;
case SLASH: if(WNUMK) Error(18); else GEN(OPR,0,5); break; //整型运算中不允许出现 '/'运算符
case DIVSYM: GEN(OPR,0,17); break; //整型的运算符,整除
case MODSYM: GEN(OPR,0,18); break; //取余预算
}
}
} /*TERM*/
//---------------------------------------------------------------------------
void EXPRESSION(SYMSET FSYS, int LEV, int &TX) {
SYMBOL ADDOP;
if (SYM==PLUS || SYM==MINUS) {
ADDOP=SYM; GetSym();
TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX);
if (ADDOP==MINUS) GEN(OPR,0,1);
}
else TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX);
while (SYM==PLUS || SYM==MINUS) {
ADDOP=SYM; GetSym();
TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX);
if (ADDOP==PLUS) GEN(OPR,0,2);
else GEN(OPR,0,3);
}
} /*EXPRESSION*/
//---------------------------------------------------------------------------
void CONDITION(SYMSET FSYS,int LEV,int &TX) {
SYMBOL RELOP;
if (SYM==ODDSYM) { GetSym(); EXPRESSION(FSYS,LEV,TX); GEN(OPR,0,6); }
else {
EXPRESSION(SymSetUnion(SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ),FSYS),LEV,TX);
if (!SymIn(SYM,SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ))) Error(20);
else {
RELOP=SYM; GetSym(); EXPRESSION(FSYS,LEV,TX);
switch (RELOP) {
case EQL: GEN(OPR,0,8); break;
case NEQ: GEN(OPR,0,9); break;
case LSS: GEN(OPR,0,10); break;
case GEQ: GEN(OPR,0,11); break;
case GTR: GEN(OPR,0,12); break;
case LEQ: GEN(OPR,0,13); break;
}
}
}
} /*CONDITION*/
//---------------------------------------------------------------------------
void STATEMENT(SYMSET FSYS,int LEV,int &TX) { /*STATEMENT*/
int i,CX1,CX2,jk,tm;
FCT STOMode[3]={STO,STOARR,STOVAR};
FCT LODMode[3]={LOD,LODARR,LODVAR};
bool IsFUN;
SYMBOL Temp;
jk=0;
tm=0;
switch (SYM) {
case IDENT:
//+++++++++++++START ++
IsFUN=FALSE;
i=POSITION(ID,TX);
if (i==0) Error(11);
else
{
if (TABLE[i].KIND==CONSTANT) /*ASSIGNMENT TO NON-VARIABLE*/
{
Error(12);
i=0;
}
//call function in statement or assimenet to function.val
if(TABLE[i].KIND==FUNCTION)
{
ParaGetSub(FSYS,LEV,TX,i);
if((LEV==0 && strcmp(FUNLAYER[LEV],ID)!=0)||SYM==RPAREN)//call
//函数调用不是第一层而且与当前函数不同名,就可以调用,
//否则就是用下面的赋值功能,作为函数返回值
{
if(strcmp(FUNLAYER[LEV],ID)==0)
GEN(CAL,0,TABLE[i].CS);
else
GEN(CAL,LEV-TABLE[i].vp.LEVEL,TABLE[i].CS);
GetSym();
break;
}
IsFUN=TRUE;
goto LOOP;
//else assiment
}
//----------------end call function
//call procedure
if(TABLE[i].KIND==PROCEDUR)
{
ParaGetSub(FSYS,LEV,TX,i);
GEN(CAL,LEV-TABLE[i].vp.LEVEL,TABLE[i].CS);
GetSym();
break;
}
//------------------end call procedure
if(TABLE[i].KIND==ARR) //处理的变量是数组
{
ARRGetSub(FSYS,LEV,TX);
jk=1;
}
if(TABLE[i].IsVAR) //处理变量是否为按地址传递的参数
{
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
jk=2;
tm=1;
}
}//else if(i==0)
if(TABLE[i].TYPE==CHARCON)
{
GetSym();
if(SYM!=BECOMES) Error(13);
else
{
GetSym();
if(SYM!=CHARS) Error(32); //类型出错
else
{
GEN(LIT,0,NUM);
GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
}
}
GetSym();
break;
}
GetSym();
if (SYM==BECOMES)
{
LOOP: if(TABLE[i].TYPE==INTCON)
WNUMK=1;
GetSym();
EXPRESSION(FSYS,LEV,TX);
if (i!=0) GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
else Error(98);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -