欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    编译原理课程设计PL0语言的扩充.docx

    • 资源ID:6689586       资源大小:140.79KB        全文页数:42页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    编译原理课程设计PL0语言的扩充.docx

    1、编译原理课程设计PL0语言的扩充一 课程设计目的 0二 课程设计要求 0基本内容: 0选做内容: 0已实现的功能: 0三 编译环境与工具 0四 结构设计说明 01PL/0编译程序的结构图 02PL/0编译程序的过程或函数的功能表 13PL/0编译程序的总体流程图 14PL/0编译程序的中间代码 25PL0的编译程序的过程和函数的功能 3五 课程设计的设计与步骤 31扩充赋值运算:+= -= *= /= + 和- - 52增加Pascal的FOR语句 153一维数组 17六 调试测试 191.+= -= *= /= + -的测试 192.FOR语句的测试 213.数组的调试 224综合调试 23

    2、七 课程设计总结 25【参考文献】 261课程设计目的在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。达到进一步了解程序编译过程的基本原理和基本实现方法的目的。2课程设计要求基本内容:(1)扩充赋值运算:*= 和 /=(2)扩充语句(Pascal的FOR语句):FOR := TO DO FOR := DOWNTO DO 其中,语句的循环变量的步长为2,语句的循环变量的步长为-2。(3)增加运算:+ 和 -。选做内容:(1)增加类型: 字符类型; 实数类型。(2)扩充函数: 有返回值和返回语句; 有参数函数。(3)增加一维数组类型

    3、(可增加指令)。(4)其他典型语言设施。已实现的功能:(1)扩充赋值运算:*=和 /= (另外也扩充了+= 和 -=)(2)扩充语句(Pascal的FOR语句):FOR := TO DO FOR := DOWNTO DO (3)增加运算:+ 和 -。(4)增加一维数组类型(可增加指令)。3编译环境与工具编译环境:Microsoft Windows 7 (64bit)编译工具:Microsoft Visual C+ 6.04结构设计说明1PL/0编译程序的结构图2PL/0编译程序的过程或函数的功能表 过程或函数名简要功能说明pl0主程序error出错处理,打印出错位置和错误编码getsym词法分

    4、析,读取一个单词getch漏掉空格,读取一个字符gen生成目标代码,并送入目标程序区test测试当前单词符号是否合法block分程序分析处理过程enter登录名字表position(函数)查找标识符在名字表中的位置constdeclaration常量定义处理vardeclaration变量说明处理listode列出目标代码清单statement语句处理expression表达式处理term项处理factor因子处理condition条件处理interpret对目标代码的解释执行程序base(函数)通过静态链求出数据区的基地址表4-1 PL/0编译程序的过程或函数的功能表3PL/0编译程序的总体

    5、流程图 图4-2 PL/0编译程序的总体流程图 4PL/0编译程序的中间代码对PL/0编译程序的目标代码的指令格式描述如下: f l a其中f代表功能码,l表示层次差,a的含意对不同的指令有所区别,见下面对每条指令的解释说明:Lit 0 a将常数值取到栈顶,a为常数值lod l a将变量值取到栈顶,a为偏移量,l为层差sto l a将栈顶内容送入某变量单元中,a为偏移量,l为层差cal l a调用过程,a为过程地址,l为层差int 0 a在运行栈中为被调用的过程开辟a个单元的数据区jmp 0 a无条件跳转至a地址jpc 0 a条件跳转,当栈顶布尔值非真则跳转至a地址,否则顺序执行opr 0 0

    6、过程调用结束后,返回调用点并退栈opr 0 1栈顶元素取反opr 0 2次栈顶与栈顶相加,退两个栈元素,结果值进栈opr 0 3次栈顶减去栈顶,退两个栈元素,结果值进栈opr 0 4次栈顶乘以栈顶,退两个栈元素,结果值进栈opr 0 5次栈顶除以栈顶,退两个栈元素,结果值进栈opr 0 6栈顶元素的奇偶判断,结果值在栈顶opr 0 7opr 0 8次栈顶与栈顶是否相等,退两个栈元素,结果值进栈opr 0 9次栈顶与栈顶是否不等,退两个栈元素,结果值进栈opr 0 10次栈顶是否小于栈顶,退两个栈元素,结果值进栈opr 0 11次栈顶是否大于等于栈顶,退两个栈元素,结果值进栈opr 0 12次栈

    7、顶是否大于栈顶,退两个栈元素,结果值进栈opr 0 13次栈顶是否小于等于栈顶,退两个栈元素,结果值进栈opr 0 14栈顶值输出至屏幕opr 0 15屏幕输出换行opr 0 16从命令行读入一个输入置于栈顶表4-2 PL/0编译程序的目标指令5PL0的编译程序的过程和函数的功能Pl0:主程序Error:出错处理,打印出错位置和错误编码Getsym:词法分析,读取一个单词Getch:漏掉空格,读取一个字符Gen:生成目标代码,并送入目标程序区Test:测试当前单词符号是否合法Block:分程序分析处理过程Enter:登陆名字表Position:查找标识符在名字表中的位置Constdeclara

    8、tion:常量定义处理Vardeclaration:变量说明处理Listcode:列出目标代码清单Statement:语句部分处理Expression:表达式处理Term:项处理Factor:因子处理Condition:条件处理Interpret:对目标代码的解释执行程序Base:通过静态链求出数据区的基地址5课程设计的设计与步骤本次课程设计是在实验的基础上,在实验中,已经实现对PL/0作以下修改扩充:(1)增加单词:保留字 ELSE,FOR,STEP,UNTIL,RETURN 运算符 +=,-=,+,-,(2)修改单词:不等号# 改为 (3)增加条件语句的ELSE子句在课程设计中,因为关键字

    9、增加到了18个,所以令 # define norw 18。SYMBOL扩展为48个值。在pl0.h中做了如下更改,具体如下(粗体部分为课程设计更改部分):enum symbol nul, ident, number, plus, minus, times, slash, oddsym, eql, neq,lss, leq, gtr, geq, lparen,rparen, comma, semicolon,period, becomes,beginsym, endsym, ifsym, thensym, whilesym,writesym, readsym, dosym, callsym, c

    10、onstsym,varsym, procsym, elsesym, forsym, stepsym, untilsym, returnsym,plusbecomes, dplus, minusbecomes, dminus, and, or, not,lepa,ripa,slashbecomes,timesbecomes,;#define symnum 48 符号和关键字扩展(粗体部分为课程设计更改部分):ssym+=plus;ssym-=minus;ssym*=times;ssym/=slash;ssym(=lparen;ssym)=rparen;ssym=eql;ssym,=comma;s

    11、sym.=period;/ssym#=neq; 去掉#,改为ssym;=semicolon;ssym!=not; /非ssym=lepa;/一维数组的左括号ssym=ripa;/一维数组的右括号/*设置保留字名字,按照字母顺序,便于折半查找*/strcpy(&(word00),begin);strcpy(&(word10),call);strcpy(&(word20),const);strcpy(&(word30),do);strcpy(&(word40),else);strcpy(&(word50),end);strcpy(&(word60),for);strcpy(&(word70),if

    12、);strcpy(&(word80),odd);strcpy(&(word90),procedure);strcpy(&(word100),read);strcpy(&(word110),return);strcpy(&(word120),step);strcpy(&(word130),then);strcpy(&(word140),until);strcpy(&(word150),var);strcpy(&(word160),while);strcpy(&(word170),write);/*设置保留字符号*/wsym0=beginsym;wsym1=callsym;wsym2=consts

    13、ym;wsym3=dosym;wsym4=elsesym;wsym5=endsym;wsym6=forsym;wsym7=ifsym;wsym8=oddsym;wsym9=procsym;wsym10=readsym;wsym11=returnsym; wsym12=stepsym;wsym13=thensym;wsym14=untilsym;wsym15=varsym;wsym16=whilesym;wsym17=writesym;设置指令名称(粗体部分为课程设计更改部分):strcpy(&(mnemoniclit0),lit); strcpy(&(mnemonicopr0),opr); s

    14、trcpy(&(mnemoniclod0),lod); strcpy(&(mnemonicsto0),sto); strcpy(&(mnemoniccal0),cal); strcpy(&(mnemonicinte0),int); strcpy(&(mnemonicjmp0),jmp); strcpy(&(mnemonicjpc0),jpc); strcpy(&(mnemonicgar0),gar); strcpy(&(mnemonicsar0),sar); strcpy(&(mnemonicshd0),shd); strcpy(&(mnemonicdel0),del); strcpy(&(m

    15、nemonicjud0),jud); strcpy(&(mnemonictra0),tra);1扩充赋值运算:+= -= *= /= + 和- -1)在symbol增加字符:Plusbecomes:+=Minusbecomes:-=Slashbecomes:*=Timesbecomes:/=2)对取字符getsym()函数进行扩充,具体如下(粗体部分为更改部分):int getsym() ./此处省略部分未修改过的代码 else if(ch=+) /读到加号 getchdo; /再读一个字符 if(ch=) /读到等号,则与+号构成加等 sym=plusbecomes; getchdo; el

    16、se if(ch=+) /读到加号,则与加号构成+ sym=dplus; getchdo; else sym=plus; /那就是一个单独的加号 else if(ch=-) /读到减号 getchdo; if(ch=) /读到等号,则与减号构成减等 sym=minusbecomes; getchdo; else if(ch=-) /读到减号,则与减号构成- sym=dminus; getchdo; else sym=minus; /那就是一个单独的减号 else if(ch=*) getchdo; if(ch=) /读到乘号,则与减号构成乘等 sym=timesbecomes; getchdo

    17、; else sym=times; /那就是一个单独的乘 else if(ch=/) getchdo; if(ch=) /读到乘号,则与减号构成除等 sym=slashbecomes; getchdo; else sym=slash; /那就是一个单独的除 ./此处省略部分未修改过的代码3)对statemen函数进行扩展int statement(bool* fsys,int * ptx,int lev) ./此处省略部分未修改过的代码 if(sym=ident) i=position(id,*ptx); if(i=0) error(11); else if(tablei.kind!=vari

    18、able&tablei.kind!=array) error(12); i=0; else getsymdo; if(sym=lepa)/如果是数组 getsymdo; /处理里的表达式 memcpy(nxtlev,fsys,sizeof(bool)* symnum); nxtlevripa=true; expressiondo(nxtlev,ptx,lev); gendo(tra,0,tablei.size);/生成将数组下标范围入栈指令 gendo(jud,0,0);/判断下标合法性 if(sym!=ripa) error(26); getsymdo; if(sym=becomes)/赋值

    19、:= getsymdo; flag=1; else if(sym=plusbecomes)/加赋值+= getsymdo; flag=2; else if(sym=minusbecomes)/减赋值-= getsymdo; flag=3; else if(sym=dplus)/+ getsymdo; flag=4; else if(sym=dminus)/- getsymdo; flag=5; else if(sym=timesbecomes)/*= getsymdo; flag=6; else if(sym=slashbecomes)/ /= getsymdo; flag=7; else e

    20、rror(13); if(i!=0) if(flag=1) /:= memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev); else if(flag=2)/+= memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev); gendo(lod,lev-tablei.level,tablei.adr);/先取值到栈顶 gendo(opr,lev-tablei.level,2);/执行加法 else if(i!=0&flag=3)

    21、/-= memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev); gendo(lod,lev-tablei.level,tablei.adr);/先取值到栈顶 gendo(opr,lev-tablei.level,3);/执行减法 gendo(opr,lev-tablei.level,1);/取反 else if(i!=0&flag=4) /+ if(tablei.kind=variable) gendo(lod,lev-tablei.level,tablei.adr);/先取值到栈顶 gendo(lit,l

    22、ev-tablei.level,1);/将值为1入栈 gendo(opr,lev-tablei.level,2);/加法,即加1 if(tablei.kind=array) gendo(gar,lev-tablei.level,tablei.adr); gendo(lit,lev-tablei.level,1); gendo(opr,lev-tablei.level,2); else if(i!=0&flag=5)/- if(tablei.kind=variable) gendo(lod,lev-tablei.level,tablei.adr);/先取值到栈顶 gendo(lit,lev-ta

    23、blei.level,1);/将值为1入栈 gendo(opr,lev-tablei.level,3);/减法,即-1 if(tablei.kind=array) gendo(gar,lev-tablei.level,tablei.adr); gendo(lit,lev-tablei.level,1); gendo(opr,lev-tablei.level,3); else if(i!=0&flag=6)/*= memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev); gendo(lod,lev-tablei

    24、.level,tablei.adr);/先取值到栈顶 gendo(opr,lev-tablei.level,4);/乘法 else if(i!=0&flag=7) / /=; gendo(lod,lev-tablei.level,tablei.adr);/先取值到栈顶 memcpy(nxtlev,fsys,sizeof(bool)* symnum); expressiondo(nxtlev,ptx,lev); gendo(opr,lev-tablei.level,5);/除法 if(tablei.kind=array) /数组,根据偏移地址存入数组 gendo(sar,lev-tablei.level,tablei.adr); gendo(del,0,0);/赋值语句需将存入数组后栈顶为偏移地址出栈 else /变量 gendo(sto,lev-tablei.level,tablei.adr); /根据变量地址存入变量 else if(s


    注意事项

    本文(编译原理课程设计PL0语言的扩充.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开