完的位置,它正是前面未定的跳转地址*/ getsymdo;
}
if (sym==elsesym) { } else { }
code[cx1].a=codePointer; code[cx1].a=codePointer+1;
int jmpdx = codePointer;//记下jmp指令位置 gendo(jmp,0,0); getsymdo;
statementdo(fsys,ptx,lev); code[jmpdx].a = codePointer;
(4)扩充赋值运算:*= 和 /=
4.1 文法
语句 -> ident *= 表达式 语句 -> ident /= 表达式 4.2 符号识别(上面已经完成) 4.3 修改statement函数
if(sym==ident)
{
i=position(id,*ptx); if(i==0) { } else {
if(table[i].kind!=variable&&table[i].kind!=character) { }
else if (table[i].kind==variable) {
getsymdo;
//如果是 := *= /=
if(sym==becomes||sym==muleqsym||sym==deviesym) {
tempsym = sym; //如果是 /= if (sym==deviesym) { } getsymdo;
//将变量放到顶
gendo(lod,lev-table[i].level,table[i].adr);
error(12); i=0; error(11);
...
}
memcpy(nxtlev,fsys,sizeof(bool)* symnum);
expressiondo(nxtlev,ptx,lev);
if (tempsym==becomes)//如果是赋值 { gendo(sto,lev-table[i].level,table[i].adr);
}
else if (tempsym==muleqsym)//如果是 *= {
//将变量放到顶 gendo(lod,lev-table[i].level,table[i].adr); //乘法运算 gendo(opr,0,4); //将结果送到变量
gendo(sto,lev-table[i].level,table[i].adr); }
else if (tempsym==deviesym)//如果是 /= { //除法法运算 gendo(opr,0,5); //将结果送到变量
gendo(sto,lev-table[i].level,table[i].adr); }
}
(5)扩充语句(Pascal的FOR语句):
①FOR <变量>:=<表达式> TO <表达式> DO <语句> ②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句> 其中,语句①的循环变量的步长为2, 语句②的循环变量的步长为-2。
5.1 文法 for语句 ::== FOR <变量>:=<表达式> TO <表达式> DO <语句> | FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>
5.2关键字识别 修改init()
void init() { ... strcpy(&(word[i++][0]),\strcpy(&(word[i++][0]),\strcpy(&(word[i++][0]),\strcpy(&(word[i++][0]),\... wsym[i++]=forsym; wsym[i++]=dosym; wsym[i++]=downtosym; wsym[i++]=tosym; ... } 5.3 语法语义解析 修改statement 增加for分支