太原理工大学编译原理实验.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1本科实验报告课程名称:编译原理实验项目:无符号数的词法分析程序(实验一)基本程序设计(实验二)实验地点:致远楼303专业班级:软件14XX学号:学生姓名:指导教师:冯秀芳2017年6月27日2一、实验目的和要求1.培养学生初步掌握编译原理实验的技能。2.验证所学理论、巩固所学知识并加深理解。3.对学生进行实验研究的基本训练。二、实验内容和原理实验一、无符号数的词法分析程序(4学时)内容:掌握词法分析的基本思想,并用高级语言编写无符号数的词法分析程序。要求:从键盘上输入一串字符(包括字母、数字等),最后以“;”结束,编写程序识别出其中的无符号数。无符号数文法规则可定义如下:无符号数→无符号实数│无符号整数无符号实数→无符号整数.数字串[E比例因子]│无符号整数E比例因子比例因子→有符号整数有符号整数→[+│-]无符号整数无符号整数→数字串数字串→数字{数字}数字→0123......9读无符号数的程序流程图见下图3开始0=w,p,j1=e数字否出错数值=〉dw*10+d=w取下一字符数字否是‘.’否是‘E’否退一字符‘整型’=〉CJ1取下一字符数字否出错数值=〉dw*10+d=wj+1=j取下一字符数字否是‘E’否取下一字符是‘-’否是‘+’否数字否数值=〉dp*10+d=p取下一字符数字否退一字符‘实型’=CJ1W*10C*P-J=CJ2出口-1=e取下一字符出错YNNNNYNYYNNYYNNYNYYNYYY三.主要仪器设备PC机+Java语言编程环境4四、实验结果与分析1.实验代码:packagetext1;importjava.io.BufferedReader;importjava.io.InputStreamReader;publicclassText1{/***@paramargs*/publicstaticvoidmain(String[]args)throwsException{//TODOAuto-generatedmethodstubintp=0,w=0,w1=0,j=0,i=0,d=0,e=1;doublew2=0;Stringstr;System.out.println(请输入一串字符以;结束:);BufferedReaderbuf=newBufferedReader(newInputStreamReader(System.in));str=buf.readLine();charm[]=newchar[100];for(i=0;istr.length();i++){m[i]=str.charAt(i);}i=0;while(istr.length()){if(m[i]48||m[i]57){i++;}else{do{d=m[i]-48;w=w*10+d;j++;i++;}while(m[i]=48&&m[i]=57);//System.out.println(chesi+m[i]);if(m[i]!='.'){if(m[i]!='E'){System.out.println(整型数为:+w);j=0;w=0;}else{i++;if(m[i]=='-'){e=-1;i++;if(m[i]=48&&m[i]=57){do{5d=m[i]-48;p=p*10+d;i++;}while(m[i]=48&&m[i]=57);if(j1)w2=w/(Math.pow(10.0,j-1));System.out.println(实型数为:+w2+*10++(e*(p-j+1)));j=0;w2=0;w=0;p=0;}elseSystem.out.println(您输入有误!);}elseif(m[i]=='+'){i++;if(m[i]=48&&m[i]=57){do{d=m[i]-48;p=p*10+d;i++;}while(m[i]=48&&m[i]=57);if(j1)w2=w/(Math.pow(10.0,j-1));System.out.println(实型数为:+w2+*10++(e*(p+j-1)));j=0;w2=0;w=0;p=0;}elseSystem.out.println(您输入有误!);}else{if(m[i]=48&&m[i]=57){do{d=m[i]-48;p=p*10+d;i++;}while(m[i]=48&&m[i]=57);if(j1)w2=w/(Math.pow(10.0,j-1));System.out.println(实型数为:+w2+*10++(e*(p+j-1)));j=0;w2=0;w=0;p=0;6}elseSystem.out.println(您输入有误!);}}}else{i++;if(m[i]=48&&m[i]=57){do{d=m[i]-48;w1=w1*10+d;//j=j+1;i++;}while(m[i]=48&&m[i]=57);}elseSystem.out.println(您输入有误!);if(m[i]!='E'){System.out.println(小数为:+w+'.'+w1);w=0;w1=0;j=0;}elseif(m[i]=='E'){i++;if(m[i]=='-'){e=-1;i++;if(m[i]=48&&m[i]=57){do{d=m[i]-48;p=p*10+d;i++;}while(m[i]=48&&m[i]=57);if(j1){w2=w/(Math.pow(10.0,j-1));System.out.println(实型数为:+w2+w1+*10++(e*(p-j+1)));w=0;w1=0;j=0;w2=0;p=0;}else{System.out.println(实型数为:+w+'.'+w1+*10++(e*(p-j+1)));w=0;w1=0;j=0;w2=0;7p=0;}}elseSystem.out.println(您输入有误!);}elseif(m[i]=='+'){i++;if(m[i]=48&&m[i]=57){do{d=m[i]-48;p=p*10+d;i++;}while(m[i]=48&&m[i]=57);if(j1){w2=w/(Math.pow(10.0,j-1));System.out.println(实型数为:+w2+w1+*10++(e*(p+j-1)));w=0;w1=0;j=0;w2=0;p=0;}else{System.out.println(实型数为:+w+'.'+w1+*10++(e*(p+j-1)));w=0;w1=0;j=0;w2=0;p=0;}}elseSystem.out.println(您输入有误!);}else{if(m[i]=48&&m[i]=57){do{d=m[i]-48;p=p*10+d;i++;}while(m[i]=48&&m[i]=57);if(j1){w2=w/(Math.pow(10.0,j-1));System.out.println(实型数为:+w2+w1+*10++(e*(p+j-1)));w=0;w1=0;j=0;w2=0;8p=0;}else{System.out.println(实型数为:+w+'.'+w1+*10++(e*(p+j-1)));w=0;w1=0;j=0;w2=0;p=0;}}elseSystem.out.println(您输入有误!);}}elseSystem.out.println(您输入有误!);}}}}}2.实验结果:9一、实验目的和要求1.培养学生初步掌握编译原理实验的技能。2.验证所学理论、巩固所学知识并加深理解。3.对学生进行实验研究的基本训练。二、实验内容和原理实验二、逆波兰式生成程序内容:掌握语法分析的基本思想,并用高级语言编写逆波兰式生成程序(4学时)要求:利用逆波兰式生成算法编写程序,将从键盘上输入的算术表达式(中缀表达式)转化成逆波兰式。逆波兰表达式的生成过程涉及到运算符的优先级,下表中列出几个常用运算符的优先关系。如表所示的优先关系矩阵表示了+,-,*,/,↑,(,)等七种运算符之间的相互优先关系。“>、<、=”三种符号分别代表“大于”、“小于”、“相等”三种优先关系。左边的“=”与右边的“(”之间没有优先关系存在,所以表中为空白。逆波兰表达式生成算法的关键在于比较当前运算符与栈顶运算符的优先关系,若当前运算符的优先级高于栈顶运算符,则当前运算符入栈,若当前运算符的优先级低于栈顶运算符,则栈顶运算符退栈。下面给出了逆波兰表达式生成算法的流程图。(为了便于比较相邻运算符的优先级,需要设立一个工作栈,用来存放暂时不能处理的运算符,所以又称运算符栈)。常用运算符优先关系矩阵+-*/↑()+>><<<<>->><<<<>*>>>><<>/>>>><<>↑>>>>><>(<<<<<<=)>>>>>>右关系左10开始输入运算符优先关系从左往右扫描中缀表达式输入串为空运算符栈是否为空比较当前运算符于栈顶运算符的优先级当前运算符的优先级高当前运算符是‘)’退栈输出栈为空结束退栈输出输出入栈入栈栈顶为‘(’栈为空退栈输出退栈ERRORNYNNNYYNNYYYNNYY11三、主要仪器设备PC机+Java语言编程环境四、实验结果与分析1.实验内容:packagecom_text4;importjava.io.*;publicclassText4{publicstaticvoidmain(String[]args)throwsIOException{//TODOAuto-generatedmethodstubinti=0,j=0;Stringstr;System.out.println(请输入一串中序表达式:);BufferedReaderbuf=newBufferedReader(newInputStreamReader(System.in));str=buf.readLine();charm[]=newchar[20];for(into=0;ostr.length();o++){m[o]=str.charAt(o);}for(into=str.length();o20;o++){m[o]='';}charn[]=newchar[m.length];for(into=0;on.length;o++)n[o]='';System.out.println(逆波兰式为:);while(i=str.length()){if(m[i]==''){if(n[j]==''){System.out.println(\n+结束!);System.exit(0);}else{do{if(n[j]!='('&&n[j]!=')')System.out.print(n[j]);n[j]='';if(j=1)j--;}while(n[j]!='');j=j+1;}12}elseif(isOperator(m[i])){while(isOperator(m[i])){if(n[j]==''){n[j]=m[i];i++;}elseif(priority(n[j],m[i])==''){j++;n[j]=m[i];i++;}elseif(m[i]==')'){while(j0){if(n[j]=='('){n[j]='';i++;}else{if(n[0]==''){System.out.println(Error);}else{if(n[j]!='('&&n[j]!=')')System.out.print(n[j]);n[j]='';if(j=1)j--;i++;}}}}else{if(n[j]!='('&&n[j]!=')')System.out.print(n[j]);n[j]='';if(j=1)j--;}}}else{Syst

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功