📄 zcompile.cpp
字号:
}
///////////////////////////////////////////////////////////////
int zCompile::syn_block()
{
char t[MAX_SYMLEN+1];
int s;
if(sym.type==TYPE_KEYWORD&&sym.id==KW_CONST)
{
_nextconst:
getsym();
if(sym.type==TYPE_SYMBOL)
{
strcpy(t,sym.name);
getsym();
if(sym.type==TYPE_OPWORD&&sym.id==OW_EQL)
{
getsym();
if(sym.type==TYPE_NUMBER)
{
formpush(t,FORM_CONST,sym.id);
getsym();
}
else
adderr("",ERR_NEEDNUM);
}
else
adderr("",ERR_NEEDEQL);
}
else
adderr("",ERR_NEEDSYM);
if(sym.type==TYPE_ENDWORD)
{
if(sym.id==EW_COMMA) goto _nextconst;
if(sym.id==EW_SEM)
getsym();
else
adderr("",ERR_NEEDEND);
}
else
adderr("",ERR_NEEDEND);
}
if(sym.type==TYPE_KEYWORD&&sym.id==KW_VAR)
{
_nextvar:
getsym();
if(sym.type==TYPE_SYMBOL)
{
_nextvar1:
formpush(sym.name,FORM_VAR,0);
getsym();
}
else
adderr("",ERR_NEEDSYM);
if(sym.type==TYPE_ENDWORD)
{
if(sym.id==EW_COMMA) goto _nextvar;
if(sym.id==EW_SEM)
getsym();
else
adderr("",ERR_NEEDEND);
}
else
adderr("",ERR_NEEDEND);
if(sym.type==TYPE_SYMBOL) goto _nextvar1;
}
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,s;
if(sym.type==TYPE_SYMBOL)
{
if(formget(sym.name,&fm)>=0)
if(fm.type!=FORM_VAR)
adderr(sym.name,ERR_NOTVAR);
else;
else
adderr(sym.name,ERR_NODEFSYM);
getsym();
if(sym.type==TYPE_OPWORD&&sym.id==OW_DEF)
{
getsym();
syn_expression();
addasm(OP_STO,formlvl-fm.lvl,fm.adr);
}
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_IF)
{
getsym();
syn_condition();
if(sym.type!=TYPE_KEYWORD||sym.id!=KW_THEN)
adderr("",ERR_NOTTHEN);
else
getsym();
t=asmnum;
addasm(OP_JPC,0,0);
syn_statement();
asms[t].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_READ)
{
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)
{
addasm(OP_OPR,0,OPR_RED);
addasm(OP_STO,formlvl-fm.lvl,fm.adr);
}
else
adderr(sym.name,ERR_NOTVAR);
else
adderr(sym.name,ERR_NODEFSYM);
getsym();
}
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();
}
}
///////////////////////////////////////////////////////////////
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};
if(sym.type==TYPE_SYMBOL)
{
if(formget(sym.name,&fm)>=0)
if(fm.type==FORM_VAR)
addasm(OP_LOD,formlvl-fm.lvl,fm.adr);
else
if(fm.type==FORM_CONST)
addasm(OP_LIT,0,fm.adr);
else
adderr(sym.name,ERR_NOPROC);
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 + -