📄 unit1.cpp
字号:
WNUMK=0;
if(IsFUN) GEN(OPR,0,0);
}
else
if(SYM==PP) //++运算
{
GetSym();
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
GEN(LIT,0,1);
GEN(OPR,0,2);
GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
}
else
if(SYM==PE) //+=运算
{
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
if(TABLE[i].TYPE==INTCON)
WNUMK=1;
GetSym();
EXPRESSION(FSYS,LEV,TX);
WNUMK=0;
GEN(OPR,0,2);
GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
}
else
if(SYM==MM) //--运算
{
GetSym();
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
GEN(LIT,0,1);
GEN(OPR,0,3);
GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
}
else
if(SYM==ME) //-=运算
{
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
if(TABLE[i].TYPE==INTCON)
WNUMK=1;
GetSym();
EXPRESSION(FSYS,LEV,TX);
WNUMK=0;
GEN(OPR,0,3);
GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL+tm,TABLE[i].vp.ADR);
}
else Error(13);
break;
//+++++++++++++++++++++END
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
{
if(TABLE[i].KIND==ARR) //如果读入到数组元素里
{
ARRGetSub(FSYS,LEV,TX);
jk=1; //存储或读取模式选1
}
if(TABLE[i].IsVAR) //处理变量是否为按地址传递的参数
{
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
jk=2;
}
if(TABLE[i].TYPE==INTCON )
GEN(OPR,0,16); //16号运算代码为输入整型
else if( TABLE[i].TYPE==CHARCON)
GEN(OPR,0,20); //20号为输入字符
else GEN(OPR,0,15); //15为输入实型
GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
}
GetSym();
}while(SYM==COMMA);
if (SYM!=RPAREN) {
Error(33);
while (!SymIn(SYM,FSYS)) GetSym();
}
else GetSym();
break; /* READSYM */
case WRITESYM:
GetSym();
if (SYM==LPAREN) {
do {
int boolen=1;
GetSym();
if(SYM==IDENT)
{
int i=POSITION(ID,TX);
if(i!=0 && TABLE[i].TYPE==CHARCON)
{
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;
}
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(OPR,0,19); //19号为输出字符
GetSym();
boolen=0;
}
}
if(boolen){
EXPRESSION(SymSetUnion(SymSetNew(RPAREN,COMMA),FSYS),LEV,TX);
GEN(OPR,0,14); //14号输出运算
}
}while(SYM==COMMA);
if (SYM!=RPAREN) Error(33);
else GetSym();
}
//GEN(OPR,0,15);
break; /*WRITESYM*/
//++++++++++++++++++++++++++++START IF语句的分析过程
case IFSYM: //PASCAL语法 为 IF <条件> THEN <语句> ELSE <语句>
GetSym(); //条件判断开始
CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);
if (SYM==THENSYM)
GetSym();
else
Error(16);
CX1=CX; //记录当前代码段到CX1后处理 THEN 后的语句
GEN(JPC,0,0);
STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ELSESYM),FSYS),LEV,TX);
if(SYM==ELSESYM) //如果后面出现ELSE
{
GetSym();
CX2=CX; //记录当前代码段到CX2
GEN(JMP,0,0);
CODE[CX1].A=CX; //回填当前代码段作为已记录CX1的JPC代码的跳转地址
STATEMENT(FSYS,LEV,TX); //ELSE后的语句
CODE[CX2].A=CX; //回填当前代码段为已记录CX2的JMP代码的跳转地址
}
else
{
CODE[CX1].A=CX; //不出现ELSE,就只回填当前代码段作为已记录CX1的JPC代码的跳转地址
}
break;
//+++++++++++++++++++++++++END */
case BEGINSYM:
GetSym();
STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX);
while (SymIn(SYM, SymSetAdd(SEMICOLON,STATBEGSYS))) {
if (SYM==SEMICOLON) GetSym();
else Error(10);
STATEMENT(SymSetUnion(SymSetNew(SEMICOLON,ENDSYM),FSYS),LEV,TX);
}
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);
GEN(JMP,0,CX1);
CODE[CX2].A=CX;
break;
//+++++++++++++++START repeatsym
case REPEATSYM:
CX1=CX;
GetSym();
STATEMENT(SymSetUnion(SymSetNew(UNTILSYM),FSYS),LEV,TX);
if (SYM==UNTILSYM) GetSym();
else Error(98);
CONDITION(FSYS,LEV,TX);
GEN(JPC,0,CX1);
break;
case FORSYM: //FOR语句的处理过程
GetSym(); //PASCAL语法 FOR <变量> := <运算表达式> TO|DOWNTO <运算表达式> DO
if(SYM==IDENT)
{
i=POSITION(ID,TX);
if(i==0) Error(11);
else
{ //变量为常数或过程都出错
if(TABLE[i].KIND==CONSTANT||TABLE[i].KIND==PROCEDUR)
{
Error(12);
i=0;
}
if(TABLE[i].KIND==ARR)
{
ARRGetSub(FSYS,LEV,TX);
jk=0;
}
if(TABLE[i].IsVAR) //处理变量是否为按地址传递的参数
{
GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
jk=2;
}
}//else if(i==0)
GetSym();
if(SYM==BECOMES) //变量赋初始值
{
GetSym(); //第一个运算表达式
EXPRESSION(SymSetUnion(SymSetNew(TOSYM,DOWNTOSYM),FSYS),LEV,TX);
}
if(SYM==TOSYM) //如果为TO
{
CX1=CX; //CX1记录当前代码段作为开始循环位置
GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); //把数存进变量中
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); //读取此变量的数,放入栈顶
GetSym();
EXPRESSION(SymSetUnion(SymSetNew(DOSYM),FSYS),LEV,TX); //计算第二个运算表达式,放入栈顶
GEN(OPR,0,13); //判断运算是否大于
CX2=CX; GEN(JPC,0,0); //CX2记录当前代码段,用于JPC的跳转地址回填
Temp=TOSYM;
}
else if(SYM==DOWNTOSYM) //DOWNTO 类似 TO,不同处为判断预算选是否小于
{
CX1=CX;
GEN(STOMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
GetSym();
EXPRESSION(SymSetUnion(SymSetNew(DOSYM),FSYS),LEV,TX);
GEN(OPR,0,11);
CX2=CX; GEN(JPC,0,0);
Temp=DOWNTOSYM;
}
else Error(19);
if(SYM==DOSYM) GetSym(); //做DO后面的<语句>
else Error(18);
STATEMENT(FSYS,LEV,TX);
GEN(LODMode[jk],LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); //读取变量的值,放入栈顶
GEN(LIT,0,1); //步长为1
switch(Temp)
{
case DOWNTOSYM: GEN(OPR,0,3); break; //DOWNTOSYM 就减 1
case TOSYM: GEN(OPR,0,2); break; //TOSYM 就加 1
}
GEN(JMP,0,CX1); //无条件跳转到CX1记录的地址段
CODE[CX2].A=CX; //回填JPC的跳转地址
}// if(SYM)
else Error(97);
break;
//+++++++++++++++END
}
TEST(FSYS,SymSetNULL(),19);
} /*STATEMENT*/
//---------------------------------------------------------------------------
void Block(int LEV, int TX, SYMSET FSYS) {
int DX=3; /*DATA ALLOCATION INDEX*/
int TX0=TX; /*INITIAL TABLE INDEX*/
int CX0=CX; /*INITIAL CODE INDEX*/
ALFA VARS[500];
DX+=DISPLAY[LEV].bp;
int count;
TABLE[TX].vp.ADR=CX; GEN(JMP,0,0);
if (LEV>LEVMAX) Error(32);
do {
if (SYM==CONSTSYM) {
GetSym();
do {
ConstDeclaration(LEV,TX,DX);
while (SYM==COMMA) {
GetSym(); ConstDeclaration(LEV,TX,DX);
}
if (SYM==SEMICOLON) GetSym();
else Error(5);
}while(SYM==IDENT);
}
if (SYM==VARSYM) //变量类型声明 依PASCAL语法为 <变量1>,<变量2>...<变量n>:<类型名>;
{
GetSym();
do
{
//VarDeclaration(LEV,TX,DX);
count=0;
if(SYM==IDENT)
{
strcpy(VARS[count],ID); //同一类型的变量都存入,临时变量队列中
count++;
GetSym();
if(count>500) Error(5);
}
else Error(4);
while (SYM==COMMA)
{
GetSym();
if(SYM==IDENT)
strcpy(VARS[count],ID);
else Error(5);
count++;
GetSym();
if(count>500) Error(5);
}
if(SYM==OO)
{
GetSym();
VarDeclaration(LEV,TX,DX,count,VARS);
}else Error(4);
//-----------------------------------------------------------------
if (SYM==SEMICOLON) GetSym();
else Error(6);
}while(SYM==IDENT);
}
while ( SYM==PROCSYM) {
GetSym();
if (SYM==IDENT) { ENTER(PROCEDUR,NOTYP,LEV,TX,DX,ID,FALSE);
TABLE[TX-1].CS=CX; GetSym(); }
else Error(4);
if (SYM==SEMICOLON) GetSym();
else Error(5);
Block(LEV+1,TX,SymSetAdd(SEMICOLON,FSYS));
if (SYM==SEMICOLON) {
GetSym();
TEST(SymSetUnion(SymSetNew(IDENT,PROCSYM),STATBEGSYS),FSYS,6);
}
else Error(5);
}
//-------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -