📄 zcompile.cpp
字号:
{ //
tid=sym.id; //
getsym(); //
if(sym.type==TYPE_ENDWORD&&sym.id==EW_RMP) //
{ //
formpush(t,FORM_VAR,tid); //
getsym(); //
goto _nextarr; //
} //
else adderr("",ERR_NEEDEND); //
} //
else adderr("",ERR_NEEDEND); //
//
} //
else if(sym.id==EW_SEM) //
{ //
formpush(t,FORM_VAR,0); //
getsym(); //
} //
else adderr("",ERR_NEEDEND); //
//
} //
else //
adderr("",ERR_NEEDEND); //
}
//////////////////////////////////////////////////////////////////////
while(sym.type==TYPE_KEYWORD&&sym.id==KW_PROCEDURE)
{
getsym();
if(sym.type==TYPE_SYMBOL)
{
s=formnum;
formpush(sym.name,FORM_PROC,0);
getsym();
}
else
adderr("",ERR_NEEDSYM);
if(sym.type==TYPE_ENDWORD&&sym.id==EW_SEM)
{
getsym();
form[s].adr=syn_block();
addasm(OP_OPR,0,OPR_RET);
formpop();
if(sym.type==TYPE_ENDWORD&&sym.id==EW_SEM)
getsym();
else
adderr("",ERR_NEEDEND);
}
else
adderr("",ERR_NEEDEND);
}
s=asmnum;
addasm(OP_INT,0,formadr[formlvl]);
syn_statement();
return s;
}
///////////////////////////////////////////////////////////////
void zCompile::syn_statement()
{
FORM fm={0};
int t=0,t1=0,t2,s;
////修改代码//////////////////////////////////////////////////////////
if(sym.type==TYPE_SYMBOL)
{
t=0;
if(formget(sym.name,&fm)>=0)
if(fm.type!=FORM_VAR)
adderr(sym.name,ERR_NOTVAR);
else
{
t1=getarrnum(sym.name);
}
else
adderr(sym.name,ERR_NODEFSYM);
getsym();
if(sym.type==TYPE_ENDWORD&&sym.id==EW_LMP)
{
getsym();
if(sym.type==TYPE_NUMBER)
{
t=sym.id;
if(t>=t1)
adderr(sym.name,ERR_ARROW);
t1=0;
getsym();
if(sym.type!=TYPE_ENDWORD||sym.id!=EW_RMP)
adderr(sym.name,ERR_NODEFSYM);
else
getsym();
}
else adderr(sym.name,ERR_NODEFSYM);
}
/////////////////////////////////////////
if(sym.type==TYPE_OPWORD&&sym.id==OW_DEF)
{
getsym();
syn_expression();
addasm(OP_STO,formlvl-fm.lvl,fm.adr+t);
}
else
adderr(sym.name,ERR_NOTDEFOP);
}
if(sym.type!=TYPE_KEYWORD) return;
if(sym.id==KW_CALL)
{
getsym();
if(sym.type==TYPE_SYMBOL)
{
if(formget(sym.name,&fm)>=0&&fm.adr)
if(fm.type==FORM_PROC)
addasm(OP_CAL,formlvl-fm.lvl,fm.adr);
else
adderr(sym.name,ERR_NOTPROC);
else
adderr(sym.name,ERR_NODEFSYM);
getsym();
}
else
adderr(sym.name,ERR_NOTSYM);
}
if(sym.id==KW_BEGIN)
{
_nextstate:
do{
if(!getsym()) return;
syn_statement();
}while(sym.type==TYPE_ENDWORD&&sym.id==EW_SEM);
if(sym.type!=TYPE_KEYWORD||sym.id!=KW_END)
{
adderr("",ERR_NOTSEM);
goto _nextstate;
}
getsym();
}
if(sym.id==KW_READ)
{
t=0;
getsym();
if(sym.type!=TYPE_ENDWORD||sym.id!=EW_LP)
adderr("",ERR_NOTPAREN);
do{
getsym();
if(sym.type==TYPE_SYMBOL)
{//修改代码/////////////////////////////////////////////////////////////////////////////////
if(formget(sym.name,&fm)>=0)
if(fm.type==FORM_VAR)
{
t1=getarrnum(sym.name);
getsym();
if(sym.type!=TYPE_ENDWORD||sym.id!=EW_LMP)
{
addasm(OP_OPR,0,OPR_RED);
addasm(OP_STO,formlvl-fm.lvl,fm.adr);
}
else if(sym.type==TYPE_ENDWORD&&sym.id==EW_LMP)
{
getsym();
if(sym.type==TYPE_NUMBER)
{
t=sym.id;
if(t>=t1)
adderr(sym.name,ERR_ARROW);
getsym();
if(sym.type==TYPE_ENDWORD&&sym.id==EW_RMP)
{
addasm(OP_OPR,0,OPR_RED);
addasm(OP_STO,formlvl-fm.lvl,fm.adr+t);
getsym();
}
else
adderr(sym.name,ERR_NODEFSYM);
}
else adderr(sym.name,ERR_NODEFSYM);
}
else adderr(sym.name,ERR_NOTVAR);
}
else
adderr(sym.name,ERR_NOTVAR);
else
adderr(sym.name,ERR_NODEFSYM);
}
else
adderr("",ERR_NEEDVAR);
}while(sym.type==TYPE_ENDWORD&&sym.id==EW_COMMA);
if(sym.type!=TYPE_ENDWORD||sym.id!=EW_RP)
adderr("",ERR_NOTPAREN);
else
getsym();
}
if(sym.id==KW_WRITE)
{
getsym();
if(sym.type!=TYPE_ENDWORD||sym.id!=EW_LP)
adderr("",ERR_NOTPAREN);
do{
getsym();
syn_expression();
addasm(OP_OPR,0,OPR_WRT);
addasm(OP_OPR,0,OPR_WRN);
}while(sym.type==TYPE_ENDWORD&&sym.id==EW_COMMA);
if(sym.type!=TYPE_ENDWORD||sym.id!=EW_RP)
adderr("",ERR_NOTPAREN);
else
getsym();
}//////////////修改代码/////////////////////////
if(sym.id==KW_IF)
{
getsym();
syn_condition();
if(sym.type!=TYPE_KEYWORD||sym.id!=KW_THEN)
adderr("",ERR_NOTTHEN);
else
getsym();
t1=asmnum;
addasm(OP_JPC,0,0);
syn_statement();
//asms[t].adr=asmnum;
getsym();
if(sym.type==TYPE_KEYWORD||sym.id==KW_ELSE)
{
getsym();
t2=asmnum;
addasm(OP_JMP,0,0);
syn_statement();
asms[t1].adr=t2+1;
asms[t2].adr=asmnum;
getsym();
}
else
asms[t1].adr=asmnum;
}
if(sym.id==KW_WHILE)
{
getsym();
t=asmnum;
syn_condition();
s=asmnum;
addasm(OP_JPC,0,0);
if(sym.type!=TYPE_KEYWORD||sym.id!=KW_DO)
adderr("",ERR_NOTDO);
else
getsym();
syn_statement();
addasm(OP_JMP,0,t);
asms[s].adr=asmnum;
}
if(sym.id==KW_REPEAT)
{
getsym();
t=asmnum;
repeat:
syn_statement();
getsym();
if(sym.type==TYPE_KEYWORD&&sym.id!=KW_UNTIL)
goto repeat;
if(sym.id!=KW_UNTIL)
adderr("",ERR_NOUNTIL);
else
{
getsym();
syn_condition();
addasm(OP_JPC,0,t);
}
}
}
///////////////////////////////////////////////////////////////
void zCompile::syn_condition()
{
int r=-1;
if(sym.type==TYPE_KEYWORD&&sym.id==KW_ODD)
{
getsym();
syn_expression();
addasm(OP_OPR,0,OPR_ODD);
}
else
{
syn_expression();
if(sym.type==TYPE_OPWORD&&sym.id>=OW_LT&&sym.id<=OW_LGE)
r=sym.id;
else
adderr(sym.name,ERR_NOTRLOP);
getsym();
syn_expression();
switch(r)
{
case OW_EQL:addasm(OP_OPR,0,OPR_EQL);break;
case OW_NE: addasm(OP_OPR,0,OPR_NE); break;
case OW_LT: addasm(OP_OPR,0,OPR_LT); break;
case OW_LGE:addasm(OP_OPR,0,OPR_LGE);break;
case OW_LG: addasm(OP_OPR,0,OPR_LG); break;
case OW_LTE:addasm(OP_OPR,0,OPR_LTE);break;
}
}
}
///////////////////////////////////////////////////////////////
void zCompile::syn_expression()
{
int c=0;
if(sym.type==TYPE_OPWORD)
{
c=sym.id;
if(c==OW_PLUS||c==OW_MINUS)
getsym();
else
adderr(sym.name,ERR_WRONGOP);
}
syn_term();
if(c==OW_MINUS) addasm(OP_OPR,0,OPR_NEG);
while(sym.type==TYPE_OPWORD&&(sym.id==OW_PLUS||sym.id==OW_MINUS))
{
c=sym.id;
getsym();
syn_term();
if(c==OW_PLUS)
addasm(OP_OPR,0,OPR_ADD);
else
addasm(OP_OPR,0,OPR_SUB);
}
}
///////////////////////////////////////////////////////////////
void zCompile::syn_term()
{
int c;
syn_factor();
while(sym.type==TYPE_OPWORD&&(sym.id==OW_TIMES||sym.id==OW_SLASH))
{
c=sym.id;
getsym();
syn_factor();
if(c==OW_TIMES)
addasm(OP_OPR,0,OPR_MUL);
else
addasm(OP_OPR,0,OPR_DIV);
}
}
///////////////////////////////////////////////////////////////
void zCompile::syn_factor()
{
FORM fm={0};
int t=0,t1=0;
////添加代码×××××××××××××××××××××××
if(sym.type==TYPE_SYMBOL)
{
if(formget(sym.name,&fm)>=0)
{
if(fm.type==FORM_VAR)
{
t1=getarrnum(sym.name);
getsym();
if(sym.type!=TYPE_ENDWORD||sym.id!=EW_LMP)
addasm(OP_LOD,formlvl-fm.lvl,fm.adr);
else if(sym.type==TYPE_ENDWORD||sym.id==EW_LMP)
{
getsym();
if(sym.type==TYPE_NUMBER)
{
t=sym.id;
if(t>=t1)
adderr(sym.name,ERR_ARROW);
t1=0;
getsym();
if(sym.type==TYPE_ENDWORD&&sym.id==EW_RMP)
{
addasm(OP_LOD,formlvl-fm.lvl,fm.adr+t);
getsym();
}
else
adderr(sym.name,ERR_NODEFSYM);
}
else adderr(sym.name,ERR_NODEFSYM);
}
/*
addasm(OP_LOD,formlvl-fm.lvl,fm.adr);
getsym();
*/
}
else if(fm.type==FORM_CONST)
{
addasm(OP_LIT,0,fm.adr);
getsym();
}
else
{
adderr(sym.name,ERR_NOPROC);
getsym();
}
}
else
{
adderr(sym.name,ERR_NODEFSYM);
getsym();
}
}
else if(sym.type==TYPE_NUMBER)
{
addasm(OP_LIT,0,sym.id);
getsym();
}
else if(sym.type==TYPE_ENDWORD&&sym.id==EW_LP)
{
getsym();
syn_expression();
if(sym.type==TYPE_ENDWORD&&sym.id==EW_RP)
getsym();
else
adderr("",ERR_NOTRP);
}
else
adderr("",ERR_NOSYM);
}
///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -