📄 unit1.cpp
字号:
}
break;
case LOD: T++; S[T]=S[BASE(I.L,B,S)+I.A]; break;
case STO: S[BASE(I.L,B,S)+I.A]=S[T]; T--; break;
case CAL: /*GENERAT NEW Block MARK*/
S[T+1]=BASE(I.L,B,S); S[T+2]=B; S[T+3]=P;
B=T+1; P=I.A; break;
case INI: T=T+I.A; break;
case JMP: P=I.A; break;
case JPC: if (S[T]==0) P=I.A; T--; break;
} /*switch*/
}while(P!=0);
Form1->printfs("~~~ END PL0 ~~~");
fprintf(FOUT,"~~~ END PL0 ~~~\n");
} /*Interpret*/
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonRunClick(TObject *Sender) {
for (CH=' '; CH<='^'; CH++) SSYM[CH]=NUL;
strcpy(KWORD[ 1],"BEGIN"); strcpy(KWORD[ 2],"CALL");
strcpy(KWORD[ 3],"CONST"); strcpy(KWORD[ 4],"DO");
strcpy(KWORD[ 5],"DOWNTO"); strcpy(KWORD[ 6],"ELSE");
strcpy(KWORD[ 7],"END"); strcpy(KWORD[ 8],"FOR");
strcpy(KWORD[ 9],"IF"); strcpy(KWORD[10],"ODD");
strcpy(KWORD[ 11],"PROCEDURE"); strcpy(KWORD[ 12],"PROGRAM");
strcpy(KWORD[13],"READ"); strcpy(KWORD[14],"THEN");
strcpy(KWORD[ 15],"TO"); strcpy(KWORD[16],"VAR");
strcpy(KWORD[17],"WHILE"); strcpy(KWORD[18],"WRITE");
WSYM[ 1]=BEGINSYM; WSYM[ 2]=CALLSYM;
WSYM[ 3]=CONSTSYM; WSYM[ 4]=DOSYM;
WSYM[ 5]=DOWNTOSYM; WSYM[ 6]=ELSESYM;
WSYM[ 7]=ENDSYM; WSYM[ 8]=FORSYM;
WSYM[ 9]=IFSYM; WSYM[ 10]=ODDSYM;
WSYM[ 11]=PROCSYM; WSYM[ 12]=PROGSYM;
WSYM[13]=READSYM; WSYM[14]=THENSYM;
WSYM[15]=TOSYM; WSYM[16]=VARSYM;
WSYM[17]=WHILESYM; WSYM[18]=WRITESYM;
SSYM['+']=PLUS; SSYM['-']=MINUS;
SSYM['*']=TIMES; SSYM['/']=SLASH;
SSYM['(']=LPAREN; SSYM[')']=RPAREN;
SSYM['=']=EQL; SSYM[',']=COMMA;
SSYM['.']=PERIOD;
SSYM[';']=SEMICOLON;
strcpy(MNEMONIC[LIT],"LIT"); strcpy(MNEMONIC[OPR],"OPR");
strcpy(MNEMONIC[LOD],"LOD"); strcpy(MNEMONIC[STO],"STO");
strcpy(MNEMONIC[CAL],"CAL"); strcpy(MNEMONIC[INI],"INI");
strcpy(MNEMONIC[JMP],"JMP"); strcpy(MNEMONIC[JPC],"JPC");
DECLBEGSYS=(int*)malloc(sizeof(int)*41);
STATBEGSYS=(int*)malloc(sizeof(int)*41);
FACBEGSYS =(int*)malloc(sizeof(int)*41);
for(int j=0; j<41; j++) {
DECLBEGSYS[j]=0; STATBEGSYS[j]=0; FACBEGSYS[j] =0;
}
DECLBEGSYS[CONSTSYM]=1;
DECLBEGSYS[VARSYM]=1;
DECLBEGSYS[PROCSYM]=1;
STATBEGSYS[BEGINSYM]=1;
STATBEGSYS[CALLSYM]=1;
STATBEGSYS[FORSYM]=1;
STATBEGSYS[IFSYM]=1;
STATBEGSYS[WHILESYM]=1;
STATBEGSYS[WRITESYM]=1;
FACBEGSYS[IDENT] =1;
FACBEGSYS[NUMBER]=1;
FACBEGSYS[LPAREN]=1;
if ((FIN=fopen((Form1->EditName->Text+".PL0").c_str(),"r"))!=0) {
FOUT=fopen((Form1->EditName->Text+".COD").c_str(),"w");
Form1->printfs("=== COMPILE PL0 ===");
fprintf(FOUT,"=== COMPILE PL0 ===\n");
ERR=0;
CC=0; CX=0; LL=0; CH=' '; GetSym();
if (SYM!=PROGSYM) Error(0);
else {
GetSym();
if (SYM!=IDENT) Error(0);
else {
GetSym();
if (SYM!=SEMICOLON) Error(5);
else GetSym();
}
}
Block(0,0,SymSetAdd(PERIOD,SymSetUnion(DECLBEGSYS,STATBEGSYS)));
if (SYM!=PERIOD) Error(9);
if (ERR==0) Interpret();
else {
Form1->printfs("ERROR IN PL/0 PROGRAM");
fprintf(FOUT,"ERROR IN PL/0 PROGRAM");
}
fprintf(FOUT,"\n"); fclose(FOUT);
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -