编译原理课程设计--对pl0进行扩充和修改(编辑修改稿)内容摘要:
x。 /*保存判断条件超作的位置 */ getsymdo。 memcpy(nxtlev,fsys,sizeof(bool)*symnum)。 nxtlev[dowhilesym]=true。 /*后跟符号为 do*/ statementdo(fsys,ptx,lev)。 /*循环体 */ /cx2=cx。 /*保存循环体的结束的下一个位置 */ //gendo(jmp,0,cx1)。 /*回头重新判断条件 */ if(sym==dowhilesym) { getsymdo。 } else { error(34)。 /*缺少 dowhile*/ } conditiondo(nxtlev,ptx,lev)。 /*调用条件处理 */ cx2=cx。 /*保存循环体的结束的下一个位置 */ gendo(jpc,0,0)。 /*生成条件跳转,但跳出循环的地址未知 */ gendo(jmp,0,cx1)。 /*回头重新判断条件 */ code[cx2].a=cx。 /*反填跳出循环的地址,与 if类似 */ } 增加运算 ++和 ① 首先来到头文件中找到 enum symbol 添加自己定义的 ++, 运算符关键字 ppl 和 mmi。 有 defiine symnum 以便词法分析时 能够正确的识别这些关键字。 ② 这里跟前面不一样的地方就是还要添加: facbegsys[ppl]=true。 facbegsys[mmi]=true。 这是一个关键的地方,因为如果把 ++或 — 当作表达式的开始符号时候,首先能够正常的标识符一样。 ③ 在词法分析程序中添加对 +=和 =的识别,也就是在程序中找到 getsym函数,添加如下: else if(ch==39。 +39。 ) { getchdo。 if(ch==39。 =39。 ) { sym=peq。 这里是自 己的定义的 +=的标识符 getchdo。 } else if(ch==39。 +39。 ) { sym=ppl。 这里是自己的定义的 +=的标识符 getchdo。 } else { sym=plus。 } } 同理对于 =的标识符: else if(ch==39。 39。 ) { getchdo。 if(ch==39。 =39。 ) { sym=meq。 这里是自己的定义的 +=的标识符 getchdo。 } else if(ch==39。 39。 ) { sym=mmi。 这里是自己的定义的 +=的标识符 getchdo。 } else { sym=minus。 } } ④ 根据前面语法描述,可以看出我这里是把 i++或 i— 作为语句或因子来进行处理的,这就得在相应地方添加语句处理功能。 作为语句处理时,在 statement 中添加代码如下: 情况一:如 a++, a— 运算符在后面: if(sym==ident)这里是以变量开始 { i=position(id,*ptx)。 变量在符号表的位置 if(i==0) { error(11)。 出错处理 } else { if(table[i].kind!=variable)只有对变量才可以做自增自减运算 { error(12)。 i=0。 } else { getsymdo。 if(sym==ppl)++运算 { gendo(lod,levtable[i].level,table[i].adr)。 把变量放入栈顶 gendo(lit,0,1)。 将常量 1 取到运行栈顶 gendo(opr,0,2)。 将栈顶和次栈顶的内容作算术加运算结果存放在次栈顶 gendo(sto,levtable[i].level,table[i].adr)。 将栈顶的内容送入变量中 getsymdo。 } else { if(sym==mmi)— 运。编译原理课程设计--对pl0进行扩充和修改(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。