📄 unit1.~cpp
字号:
GEN(LIT,0,NUM); GetSym();
}
else //整型值
if (SYM==NUMBER&&KIND==Int) {
if(type!=Int&&type!=notype)Error(104);
if (NUM>AMAX) { Error(31); NUM=0; }
GEN(LIT,0,NUM); GetSym();
}
else//REAL型值
if (SYM==NUMBER&&KIND==REAL) {
if(type!=REAL&&type!=notype)Error(104);
if (NUM>AMAX) { Error(31); NUM=0; }
GEN(LIT,0,NUM); GetSym();
}
else
if (SYM==LPAREN) {
GetSym(); EXPRESSION(SymSetAdd(RPAREN,FSYS),LEV,TX,type);
if (SYM==RPAREN) GetSym();
else Error(22);
}
else
if(SYM==ADDADD||SYM==JIANJIAN) {
TEMP=SYM;
GetSym();
if(SYM!=IDENT)Error(95);
else{
n=FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH)),LEV,TX,type);
GEN(LIT,0,1);
if(TEMP==ADDADD)GEN(OPR,0,2);
else GEN(OPR,0,3);
GEN(STO,TABLE[n].vp.LEVEL,TABLE[n].vp.ADR);
GEN(LOD,LEV-TABLE[n].vp.LEVEL,TABLE[n].vp.ADR);
}
}
TEST(FSYS,FACBEGSYS,23);
}
return i;
}/*FACTOR*/
//---------------------------------------------------------------------------
void TERM(SYMSET FSYS, int LEV, int &TX,int type) { /*TERM*/
SYMBOL MULOP,TEMP;
int i;
i=FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH,ADDADD)), LEV,TX,type);
if(SYM==ADDADD||SYM==JIANJIAN) {TEMP=SYM;
GEN(LIT,0,1);
if(TEMP==ADDADD)GEN(OPR,0,2);
else GEN(OPR,0,3);
GEN(STO,TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LIT,0,1);
if(TEMP==ADDADD)GEN(OPR,0,3);
else GEN(OPR,0,2);
GetSym();}
while (SYM==TIMES || SYM==SLASH) {
MULOP=SYM; GetSym();
FACTOR(SymSetUnion(FSYS,SymSetNew(TIMES,SLASH,ADDADD)),LEV,TX,type);
if(SYM==ADDADD||SYM==JIANJIAN) {TEMP=SYM;
GEN(LIT,0,1);
if(TEMP==ADDADD)GEN(OPR,0,2);
else GEN(OPR,0,3);
GEN(STO,TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LIT,0,1);
if(TEMP==ADDADD)GEN(OPR,0,3);
else GEN(OPR,0,2);
GetSym();}
if (MULOP==TIMES) GEN(OPR,0,4);
else GEN(OPR,0,5);
}
} /*TERM*/;
//---------------------------------------------------------------------------
void EXPRESSION(SYMSET FSYS, int LEV, int &TX,int type) {
SYMBOL ADDOP;
if (SYM==PLUS || SYM==MINUS) {
ADDOP=SYM;
GetSym();
TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX,type);
if (ADDOP==MINUS)
GEN(OPR,0,1);
}
else TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX,type);
while (SYM==PLUS || SYM==MINUS) {
ADDOP=SYM;
GetSym();
TERM(SymSetUnion(FSYS,SymSetNew(PLUS,MINUS)),LEV,TX,type);
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,notype); GEN(OPR,0,6); }
else {
EXPRESSION(SymSetUnion(SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ),FSYS),LEV,TX,notype);
if (!SymIn(SYM,SymSetNew(EQL,NEQ,LSS,LEQ,GTR,GEQ))) Error(20);
else {
RELOP=SYM; GetSym(); EXPRESSION(FSYS,LEV,TX,notype);
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 FUCTIONDO(SYMSET FSYS,int LEV,int &TX){
int i=POSITION(ID,TX);
GEN(INI,0,1); GetSym();
if(SYM==LPAREN)GetSym();
else Error(109);
//if(TABLE[i].vp.FP->Passnum!=0)
for(int j=i+1,m=0;TABLE[i].vp.FP->Passnum>m&&SYM!=RPAREN;j++,m++)
{
switch(SYM)
{
case NUMBER:
if(KIND==TABLE[j].KIND) {
CODE[TABLE[i].vp.FP->CX[m]].A=NUM;
}
else Error(110);
break;
case CHARNUM:
if(KIND==TABLE[j].KIND) {
CODE[TABLE[i].vp.FP->CX[m]].A=NUM;
}
else Error(111);
break;
case IDENT:
int x=POSITION(ID,TX);String s=ID;
if(TABLE[x].vp.ADR!=2)
if(TABLE[x].KIND==TABLE[j].KIND) {
CODE[TABLE[i].vp.FP->CX[m]].A=TABLE[x].vp.ADR;
CODE[TABLE[i].vp.FP->CX[m]].L=TABLE[i].vp.LEVEL-TABLE[x].vp.LEVEL+1;
}
else Error(112);
break;
}//switch
} //for
GEN(CAL,LEV-TABLE[i].vp.LEVEL,2);
}
//----------------------------------------------------------------------
void STATEMENT(SYMSET FSYS,int LEV,int &TX,int TX0) { /*STATEMENT*/
int i,CX1,CX2,DX1;
SYMBOL TEMP;
switch (SYM) {
case IDENT:
i=POSITION(ID,TX);
if (i==0) Error(11);
else
if (TABLE[i].KIND==CONSTANT) { /*ASSIGNMENT TO NON-VARIABLE*/
Error(12); i=0;
}
else
if(TABLE[i].KIND==PROCEDUR||TABLE[i].KIND==FUCTIONC)
{
GetSym();
if(SYM==BECOMES) //处理对函数名的赋值语句
{ GetSym();
if(SYM==NUMBER)
{
GEN(LIT,0,NUM);
GEN(STO,0,TABLE[i].vp.ADR);
}
else
if(SYM==IDENT)
{
int n=POSITION(ID,TX);
//if( TABLE[n].KIND==TABLE[i].KIND){
GEN(LOD,LEV-TABLE[n].vp.LEVEL,TABLE[n].vp.ADR);
GEN(STO,0,TABLE[i].vp.ADR);
//}
//else Error(112);
}
GetSym();
return;
}
GEN(INI,0,1); //对调用函数的处理
if(SYM==LPAREN)GetSym();
else Error(109);
for(int j=i+1,m=0;j<=TABLE[i].vp.FP->Passnum&&SYM!=RPAREN;j++,m++)
{
switch(SYM)
{
case NUMBER:
if(KIND==TABLE[j].KIND) {
CODE[TABLE[i].vp.FP->CX[m]].A=NUM;
}
else Error(110);
break;
case CHARNUM:
if(KIND==TABLE[j].KIND) {
CODE[TABLE[i].vp.FP->CX[m]].A=NUM;
}
else Error(111);
break;
case IDENT:
int x=POSITION(ID,TX);
if(TABLE[x].KIND==TABLE[j].KIND) {
CODE[TABLE[i].vp.FP->CX[m]].A=TABLE[x].vp.ADR;
CODE[TABLE[i].vp.FP->CX[m]].L=TABLE[i].vp.LEVEL-TABLE[x].vp.LEVEL+1;
}
else Error(112);
break;
}//switch
} //for
GEN(CAL,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}
else
if(TABLE[i].KIND==ARRAY){
GetSym();
if(SYM!=LZPAREN)Error(105);
GetSym();
if(SYM==NUMBER&&KIND==Int)DX1=NUM-1;
else
Error(105);
GetSym();
if(SYM!=RZPAREN)Error(105);
}
GetSym();
if(SYM==ADDADD||SYM==JIANJIAN)
{
if (i!=0){
if(TABLE[i].KIND==ARRAY)
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR+DX1);
else
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}
GEN(LIT,0,1);
if(SYM==ADDADD)
GEN(OPR,0,2);
else
GEN(OPR,0,3);
GetSym();
}//
else{
if (SYM==BECOMES){GetSym();if(SYM==YINHAO)GetSym(); }
else
if(SYM==ADDNEQ||SYM==JIANNEQ) {
if(TABLE[i].KIND==ARRAY)
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR+DX1);
else
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
if(SYM==ADDNEQ)TEMP=ADDNEQ;
else TEMP=JIANNEQ;
GetSym();
}
else Error(13);//这里还要修改出错
EXPRESSION(FSYS,LEV,TX,TABLE[i].KIND);
if(TEMP==ADDNEQ)
GEN(OPR,0,2);
else if(TEMP==JIANNEQ)
GEN(OPR,0,3); }
if (i!=0){
if(TABLE[i].KIND==ARRAY)
GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR+DX1);
else
GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}
break;
case READSYM:
GetSym();
if (SYM!=LPAREN) Error(34);
else
do {
GetSym();
if (SYM==IDENT) i=POSITION(ID,TX);
else i=0;
if (i==0) Error(35);
else {
GEN(OPR,0,16);
GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}
GetSym();
}while(SYM==COMMA);
if (SYM!=RPAREN) {
Error(34);
while (!SymIn(SYM,FSYS)) GetSym();
}
else GetSym();
break; /* READSYM */
case WRITESYM:
GetSym();
if (SYM==LPAREN) {
do {
GetSym();
EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX,notype);
GEN(OPR,0,14);
}while(SYM==COMMA);
if (SYM!=RPAREN) Error(33);
else GetSym();
}
GEN(OPR,0,15);
break; /*WRITESYM*/
case CALLSYM:
GetSym();
if (SYM!=IDENT) Error(14);
else {
i=POSITION(ID,TX);
if (i==0) Error(11);
else
if (TABLE[i].KIND==PROCEDUR)
GEN(CAL,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
else Error(15);
GetSym();
}
break;
case IFSYM:
GetSym();
CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);
if (SYM==THENSYM) GetSym();
else Error(16);
CX1=CX;
GEN(JPC,0,0);
STATEMENT(FSYS,LEV,TX,TX0);
GetSym();
if(SYM==ELSESYM)
{
CX2=CX;
GEN(JMP,0,0);
CODE[CX1].A=CX;
GetSym();
STATEMENT(FSYS,LEV,TX,TX0);
CODE[CX2].A=CX;
}
//else
//CODE[CX1].A=CX;
break;
case BEGINSYM:
GetSym();
if(TABLE[TX0].vp.FP!=NULL)//过程或函数带参
{
for(int n=0;n<TABLE[TX0].vp.FP->Passnum;n++)// 生成填充实参的指令
{
TABLE[TX0].vp.FP->CX[n]=CX;
GEN(LOD,0,21);
GEN(STO,LEV-TABLE[TX0+n+1].vp.LEVEL,TABLE[TX0+n+1].vp.ADR);
}
}
STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX,TX0);
while (SymIn(SYM, SymSetAdd(SEMICOLON,STATBEGSYS))) {
if (SYM==SEMICOLON) GetSym();
else
Error(10);
if(SYM==ENDSYM)break; //自己加上去,值得仔细考虑 ,不加也可以,
//把DEFAULT去掉,这样ENDSYM就没有处理,返回WHILE时不满足循环
//条件 ,所以不会继续循环
STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX,TX0);
}
if (SYM==ENDSYM) GetSym();
else Error(17);
break;
case WHILESYM:
CX1=CX; GetSym(); CONDITION(SymSetAdd(DOSYM,FSYS),LEV,TX);
CX2=CX; GEN(JPC,0,0);
if (SYM==DOSYM) GetSym();
else Error(18);
STATEMENT(FSYS,LEV,TX,TX0);
GEN(JMP,0,CX1);
CODE[CX2].A=CX;
break;
case REPEATSYM:
GetSym();
CX1=CX;
STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,UNTILSYM),FSYS),LEV,TX,TX0);
GetSym();
if(SYM!=UNTILSYM)Error(36);
else{
GetSym();
CONDITION(SymSetUnion(SymSetNew(SEMICOLON),FSYS),LEV,TX);
GEN(JPC,0,CX1); }
break;
case FORSYM:
SYMBOL TOD;
GetSym();
if(SYM!=IDENT)Error(99);
else{
//-------------------
i=POSITION(ID,TX);
if (i==0) Error(11);
else
if (TABLE[i].KIND==PROCEDUR||TABLE[i].KIND==CONSTANT) { /*ASSIGNMENT TO NON-VARIABLE*/
Error(12); i=0;
}
GetSym();
if (SYM==BECOMES) GetSym();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -