📄 pl0.cpp
字号:
printf(" IN ALL %d CODES.\n",to-from);
} /* listcode*/
/*////////////////////////////////////////////////////////////////////*/
void bfactor(symset fsys)
{// 布尔型因子,处理布尔因子
void expression(symset);
int relop,addop;
symset set;
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
if(sym==SYM_NOT)
{
addop=SYM_NOT;
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else
{
set=uniteset(relset,fsys);
expression(set);
destroyset(set);
if(!inset(sym,relset))
{
error(20);
}
else
{
relop=sym;
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
expression(fsys);
switch(relop)
{
case SYM_EQU:
gen(OPR, 0, OPR_EQU);
break;
case SYM_NEQ:
gen(OPR, 0, OPR_NEQ);
break;
case SYM_LES:
gen(OPR, 0, OPR_LES);
break;
case SYM_GEQ:
gen(OPR, 0, OPR_GEQ);
break;
case SYM_GTR:
gen(OPR, 0, OPR_GTR);
break;
case SYM_LEQ:
gen(OPR, 0, OPR_LEQ);
break;
}//switch
}//else
}
if(addop==SYM_NOT)
{
gen(OPR,0,OPR_NOT);
}
}//bfactor
void bterm(symset fsys)
{ // 布尔型项
symset set;
set=uniteset(fsys,createset(SYM_AND,SYM_NULL));
bfactor(set);
while(sym==SYM_AND)
{
getsym();
if(sym==SYM_EXPL1) explanation();
bfactor(set);
gen(OPR,0,OPR_AND);
}
destroyset(set);
} //bterm
void bexpression(symset fsys)
{//布尔表达式
symset set;
set=uniteset(fsys,createset(SYM_OR,SYM_NULL));
bterm(set);
while(sym==SYM_OR)
{
gen(OPR,0,OPR_OR);
}
destroyset(set);
}//bexpression
void bcondition(symset fsys)
{//布尔条件
int mulop ;
symset set;
mulop=sym;
if(sym==SYM_NOT)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
set=uniteset(relset,fsys);
bexpression(set);
destroyset(set);
if(mulop==SYM_NOT)
{
gen(OPR,0,OPR_NOT);
}
}//bcondition
void factor(symset fsys)/*因子的识别*/
{
void expression(symset);
int i;
symset set;
test(facbegsys, fsys, 24); /* The symbol can not be as the beginning of an expression.*/
while (inset(sym, facbegsys))
{
if (sym == SYM_IDENTIFIER)
{
if ((i = position(id)) == 0)
{
error(11); /* Undeclared identifier.*/
}
else
{
switch (table[i].kind)
{
mask* mk;
case ID_CONSTANT:
gen(LIT, 0, table[i].value);
break;
case ID_VARIABLE:
mk = (mask*) &table[i];
gen(LOD, level - mk->level, mk->address);
break;
case ID_PROCEDURE:
error(21); /* Procedure identifier can not be in an expression.*/
break;
} /* switch */
}
getsym(); if(sym==SYM_EXPL1) explanation();
}
else if (sym == SYM_NUMBER)
{
if (num > MAXADDRESS)
{
error(25); /* The number is too great.*/
num = 0;
}
gen(LIT, 0, num);
getsym(); if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else if (sym == SYM_LPAREN)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
set = uniteset(createset(SYM_RPAREN, SYM_NULL), fsys);
expression(set);
destroyset(set);
if (sym == SYM_RPAREN)
{
getsym(); if(sym==SYM_EXPL1) explanation();
}
else
{
error(22); /* Missing ')'.*/
}
}
test(fsys, createset(SYM_LPAREN, SYM_NULL), 23);
} /* while*/
} /* factor*/
/*/////////////////////////////////////////////////////////////////////*/
void term(symset fsys)/*项的识别*/
{
int mulop;
symset set;
set = uniteset(fsys, createset(SYM_TIMES, SYM_SLASH, SYM_NULL));
factor(set);
while (sym == SYM_TIMES || sym == SYM_SLASH)
{
mulop = sym;
getsym(); if(sym==SYM_EXPL1) explanation();
factor(set);
if (mulop == SYM_TIMES)
{
gen(OPR, 0, OPR_MUL);
}
else
{
gen(OPR, 0, OPR_DIV);
}
} /* while*/
destroyset(set);
} /* term*/
/*/////////////////////////////////////////////////////////////////////*/
void expression(symset fsys)/*表达式的识别*/
{
int addop;
symset set;
set = uniteset(fsys, createset(SYM_PLUS, SYM_MINUS, SYM_NULL));
if (sym == SYM_PLUS || sym == SYM_MINUS)
{
addop = sym;
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
term(set);
if (addop == SYM_MINUS)
{
gen(OPR, 0, OPR_NEG);
}
}
else
{
term(set);
}
while (sym == SYM_PLUS || sym == SYM_MINUS)
{
addop = sym;
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
term(set);
if (addop == SYM_PLUS)
{
gen(OPR, 0, OPR_ADD);
}
else
{
gen(OPR, 0, OPR_MIN);
}
} /* while*/
destroyset(set);
} /* expression*/
/*////////////////////////////////////////////////////////////////////*/
void condition(symset fsys)
{ /*条件的识别*/
int relop;
symset set;
if (sym == SYM_ODD)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
expression(fsys);
gen(OPR, 0, 6);
}
else
{
set = uniteset(relset, fsys);
expression(set);
destroyset(set);
if (! inset(sym, relset))
{
error(20);
}
else
{
relop = sym;
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
expression(fsys);
switch (relop)
{
case SYM_EQU:
gen(OPR, 0, OPR_EQU);
break;
case SYM_NEQ:
gen(OPR, 0, OPR_NEQ);
break;
case SYM_LES:
gen(OPR, 0, OPR_LES);
break;
case SYM_GEQ:
gen(OPR, 0, OPR_GEQ);
break;
case SYM_GTR:
gen(OPR, 0, OPR_GTR);
break;
case SYM_LEQ:
gen(OPR, 0, OPR_LEQ);
break;
} /* switch*/
} /* else*/
} /* else*/
} /* condition*/
/*////////////////////////////////////////////////////////////////////*/
void statement(symset fsys)
{ /*语句的声明*/
int i, cx1, cx2;
char id1[MAXIDLEN+1];
symset set1, set2,set;
if (sym == SYM_IDENTIFIER)
{ /* variable assignment*/
mask* mk;
i=position(id);
if(i==0)
{
error(11); /* Undeclared identifier.*/
}
else if(table[i].kind != ID_VARIABLE)
{
error(12); /* Illegal assignment.*/
i = 0;
}
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
if (sym == SYM_BECOMES)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else
{
error(13); /* ':=' expected.*/
}
if(sym==SYM_ARRAY) {}
else expression(fsys);
mk = (mask*) &table[i];
if (i)
{
gen(STO, level - mk->level, mk->address);
}
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else if(sym==SYM_ARRAY)
{
mask *mk;
if(!(i=position(id)))
{
error(11);
}
else if(table[i].kind!=ID_VARIABLE)
{
error(12);
i=0;
}
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
if(sym==SYM_NUMBER)
{
j=num;
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else error(12);
if(sym==SYM_RP)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else error(18);
if(sym==SYM_BECOMES)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else error(13);
if(sym==SYM_ARRAY) {}
expression(fsys);
mk=(mask*)&table[i+j-m];
if(i) gen(STO,level-mk->level,mk->address);
}
else if (sym == SYM_CALL)
{ /* procedure call*/
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
if (sym != SYM_IDENTIFIER)
{
error(14); /* There must be an identifier to follow the 'call'.*/
}
else
{
i = position(id);
if(i==0)
{
error(11); /*Undeclared identifier.*/
}
else if (table[i].kind == ID_PROCEDURE)
{
mask* mk;
mk = (mask*) &table[i];
gen(CAL, level - mk->level, mk->address);
}
getsym();
//>>>>>>>>>>>>>>>>>>处理pl0的函数的参数<<<<<<<<<<<<<<<<<<<//
if(sym==SYM_LPAREN)
{
getsym();
if(sym==SYM_EXPL1) explanation(); //处理pl0的注释
if(sym==SYM_IDENTIFIER||sym==SYM_NUMBER)
{
if(sym==SYM_IDENTIFIER) enter(ID_VARIABLE);
else enter(ID_CONSTANT);
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}//if
else error(31);
while(sym==SYM_COMMA)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
if(sym==SYM_IDENTIFIER||sym==SYM_NUMBER)
{
if(sym==SYM_IDENTIFIER) enter(ID_VARIABLE);
else enter(ID_CONSTANT);
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}//if
}//while
if(sym==SYM_RPAREN)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else error(22);
}//if
//>>>>>>>>>>>>>>>>>>>>>处理完毕<<<<<<<<<<<<<<<<<<<<<<<<//
}
jpx=cx;
}
else if (sym == SYM_IF) /*if语句的处理*/
{ /* if statement*/
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
set1 = createset(SYM_THEN,SYM_ELSE, SYM_DO, SYM_NULL);
set = uniteset(set1, fsys);
condition(set);
destroyset(set1);
destroyset(set);
if (sym == SYM_THEN)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else
{
error(16); /* 'then' expected.*/
}
cx1 = cx;
gen(JPC, 0, 0);
statement(fsys);
code[cx1].a = cx;
//>>>>>>>>>>>>>>>>>填加的else语句<<<<<<<<<<<<<<<<<<//
if(sym==SYM_SEMICOLON||sym==SYM_ELSE)
{
if(sym==SYM_SEMICOLON)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
if(sym==SYM_ELSE)
{
getsym();
if(sym==SYM_EXPL1) explanation(); //处理pl0的注释
statement(fsys);
while(sym==SYM_SEMICOLON)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
statement(fsys);
}
}
}
//>>>>>>>>>>>>>>>>>>>>>else语句结束*/<<<<<<<<<<<<<<<<<<<<<<//
}
else if (sym == SYM_BEGIN) /*begin……end 语句的处理*/
{ /* block*/
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
set1 = createset(SYM_SEMICOLON, SYM_END, SYM_NULL);
set = uniteset(set1, fsys);
statement(set);
while (sym == SYM_SEMICOLON || inset(sym, statbegsys))
{
if (sym == SYM_SEMICOLON)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else
{
}
statement(set);
} /* while*/
destroyset(set1);
destroyset(set);
if (sym == SYM_END)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else
{
error(17); /* ';' or 'end' expected.*/
}
}
//>>>>>>>>>>>>>>>>>>>>>>>填加的for语句<<<<<<<<<<<<<<<<<<<<<<<<//
else if (sym == SYM_FOR)
{ /*for statement */
cx1=cx;
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
if(sym==SYM_LPAREN)
{
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
}
else error(29);
while(sym!=SYM_SEMICOLON) getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
set1=createset(SYM_BEGIN,SYM_END,SYM_NULL);
set=uniteset(set1,fsys);
condition(set);
destroyset(set1);
destroyset(set);
cx2=cx;
gen(JPC,0,0);
if(sym==SYM_SEMICOLON)
{
getsym();
if(sym==SYM_EXPL1) explanation(); //处理pl0的注释
id1[0]=id[0];
}
else
{
error(29);
}
while(sym!=SYM_RPAREN) getsym();
if(sym==SYM_EXPL1) explanation();//处理pl0的注释
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -