1、 编译原理 课程设计报告 一完成内容 1. 扩充*=和/=语句 2. 扩充 for 语句,可双方向逼近 step 3. 增加类型: 字符类型; 实数类型。 二设计思路 1. 扩充扩充*=和和/=语句语句 1)产生式以及产生式以及语法描述图语法描述图 赋值语句:= := 赋值语句赋值语句ident:=表达式 ident*=表达式 ident/=表达式 2)写出递归下降子程序)写出递归下降子程序 T() /表示赋值语句函数 Expression()/计算表达式的值并返回 T() getsym(); if(sym=ident) getsym(); if(sym=”:=”) ident=Express
2、ion(); else if(sym=”*=”) ident=ident*=Expression(); else if(sym=”/=”) ident=ident/=Expression(); else error(); 3)举例设计语句的)举例设计语句的 pcode 代码代码 源程序: pcode 代码 4)在递归下降子程序中增加语义动作在递归下降子程序中增加语义动作 T() getsym(); if(sym=ident) getsym(); if(sym=”:=”) ident=Expression(); else if(sym=”*=”) ident=ident*=Expression(
3、); else if(sym=”/=”) ident=ident/=Expression(); else error(); 关键代码: getsymdo; if(sym=becomes) getsymdo; /num保存了值 memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev); /计算表达式 if(i!=0) gendo(sto,lev-tablei.level,tablei.adr);/把栈顶的值 赋值 else if(sym=timesequal)/乘等 getsymdo; /num保存了值,值在栈顶
4、 memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev); /计算表达式 gendo(lod,lev-tablei.level,tablei.adr);/把变量放到 栈顶 /gendo(opr,0,14); 观察栈顶 /gendo(opr,0,15); gendo(opr,0,4); if(i!=0) gendo(sto,lev-tablei.level,tablei.adr);/ 把 栈 顶 的值赋值 else if(sym=slashequal)/除等 gendo(lod,lev-tablei.level
5、,tablei.adr);/ 把 栈 顶 的值赋值 getsymdo; /num保存了值 memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev); /计算表达式 /gendo(opr,0,14); 观察栈顶 /gendo(opr,0,15); gendo(opr,0,5); if(i!=0) gendo(sto,lev-tablei.level,tablei.adr);/把 栈顶的值赋值 else error(13); 2. 扩充扩充 for 语句语句 1)产生式以及语法描述图)产生式以及语法描述图 For
6、语句:=for := step do For语句语句forident:=表达式step表达式do语句 2)写出递归下降写出递归下降子程序子程序 express()/计算表达式,并返回结果 For() getsym(); If(sym=for) Getsym(); If(sym=ident) getsym(); sexpress(); getsym(); if(sym =”step”) express(); getsym(); if(sym=do) getsym(); statement(); else error(); else error(); else error(); else error(); 3)for语句执行流程图语句执行流程图 开始 计算ident 计算表达式结果 复